Docker菜鸟教程:名字空间、控制组、Union 文件系统
Namespaces
Namespaces是Linux内核的一个强大功能。每个容器都有自己的命名空间,其中运行的应用程序似乎运行在独立的操作系统上。命名空间确保容器不会互相影响。
- Pid命名空间
不同的用户进程通过pid命名空间分隔,不同的命名空间可能有相同的pid。 Docker中所有LXC进程的父进程都是Docker进程,每个LXC进程都有不同的命名空间。同时,由于可以嵌套,因此可以轻松实现嵌套的 Docker 容器。 - net命名空间
有了pid命名空间,每个命名空间的pid可以是独立的,但网络端口仍然共享主机端口。网络隔离是通过net命名空间实现的。每个命名空间都有独立的网络设备、IP地址、路由表和/proc/net目录。这样就可以实现各个容器网络的隔离。 Docker通过将容器内的虚拟网卡连接到主机上的Docker网桥docker0来使用veth。 - ipc命名空间
容器中进程之间的通信仍然使用Linux的标准进程间通信(IPC)方法,包括信号量、消息队列和集体内存。但与VM不同的是,容器的进程间通信是与宿主机同一个pid命名空间内的进程间通信。因此,在请求IPC资源时需要添加命名空间信息。每个IPC资源都有一个唯一的32位id。 - mnt命名空间
类似于chroot,将进程放置在一个特殊的目录中执行。 mnt命名空间允许不同命名空间中的进程看到不同的文件结构,因此命名空间中的每个进程看到的文件目录是独立的。与 chroot 不同的是,命名空间中每个容器的 /proc/mounts 中的信息只包含命名空间的挂载点。 - uts 命名空间
UTS(“UNIX 分时系统”)命名空间允许每个容器拥有独立的主机名和域名,因此可以将其视为网络上的独立节点,而不是“主机”。一步。 - 用户名
每个容器可以有不同的用户和组ID,这意味着可以使用容器内的用户而不是主机的用户在容器内执行程序。
控制组
控制组 (cgroup) 是 Linux 内核的一个组件,主要用于打开、限制和控制共享资源。只有控制分配给容器的资源,才能避免多个容器同时运行时对系统资源的竞争。
控制组技术最早由 Google 开发人员于 2006 年引入,从 2.6.24 开始就得到 Linux 内核的支持。
控制组可以提供对容器内内存、CPU、磁盘IO等资源的控制和管理。
联合文件系统
联合文件系统(UnionFS)是一个分层的、轻量级的、高效的文件系统。它支持将逐层放置的文件系统更改为单个呈现。将不同的目录组合成一个虚拟文件系统(将多个目录组合成一个虚拟文件系统)。
联合文件系统是Docker镜像的核心。图像可以通过分层继承。基于基础镜像(不含父镜像),可以创建各种自定义应用程序镜像。
此外,不同的Docker容器可以共享一些基本的文件系统层,同时,添加独特的配置层,提高存储性能。 Docker使用的
AUFS(AnotherUnionFS)是一个联合文件系统。 AUFS支持为每个成员目录设置只读、读写和whiteout权限(类似于Git分支)。同时AUFS也有同样的等级思想。对于只读权限,可以增量更改“权限”部分(不影响只读部分)。
Docker 目前支持多种文件系统,包括 AUFS、btrfs、vfs 和 DeviceMapper。
容器格式
最初,Docker 在 LXC 中采用了容器格式。从版本 1.20 开始,Docker 还默认支持新的 libcontainer 格式。
对更多容器格式的支持仍在开发中。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网