ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## chroot chroot,即change root directory(更改root目录)。在Linux系统中,系统默认的目录结构都是以"/",使用 chroot命令可以将指定的位置作为"/"位置。 ### 为什么使用chroo命令 * **增加系统的安全性,限制了用户的权限:** 经过chroot之后,在新根下将访问不到旧系统的根目录结构和文件。 * **建立一个与原系统隔离的系统目录结构,方便用户的开发:** 使用chroot后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。 * **切换系统的根目录位置,引导 Linux 系统启动以及急救系统等** chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。 Docker 是利用 Linux 的 **Namespace** 、**Cgroups** 和**联合文件系统**三大机制来保证实现的。 使用**Namespace**做主机名、网络、PID等资源的隔离;使用**Cgroups**对进程或者进程组做资源限制;**联合文件系统**用于镜像的构建和容器运行环境。 ## Namespace Namespace是Linux内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。Namespace可以隔离进程ID、主机名、用户ID、文件名、网络访问和进程间通信等相关资源。 Docker主要用到以下命名空间。 **pid namespace**: 用于隔离进程ID。 **net namespace**:隔离网络接口,在虚拟的net namespace内用户可以拥有自己独立的IP、路由、端口等。 **mnt namespace**:文件系统挂载点隔离。 **ipc namespace**:信号量,消息队列和共享内存的隔离。 **uts namespace**:主机名和域名的隔离。 ## Cgroups Cgroups是一种内核功能,可以限制和隔离进程的资源使用情况(CPU、内存、磁盘I/O、网络等)。在容器中实现中,Cgroups通常用来限制容器的CPU和内存等资源的使用。 ## 联合文件系统 联合文件系统,又叫UnionFS,是一种通过创建文件层进程操作的文件系统。因此,联合文件系统非常轻快。Docker使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有AUFS、Overlay和Devicemapper等。 ***** **Docker镜像是由文件系统叠加而成。** 最底端是引导`文件系统`,即bootfs。当一个容器启动后,会被移到内存中,引导文件系统会被卸载(umount),以留出更多的内存供initrd磁盘镜像使用。 第二层是root文件系统,即rootfs,位于引导文件系统之上。rootfs可以使一种或多种操作系统。 在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载(union mount) 技术又会在root文件系统层上加载更多的只读文件系统。 一个镜像可以放到另一个镜像的顶部。位于下面的镜像成为**父镜像**,依次类推。最底部的镜像成为**基础镜像**。当从一个镜像启动容器时,Docker会在该镜像的顶部加载一个读写文件系统,在Docker中运行的程序就是在这个读写层中执行的。