《Docker……》笔记-8 Docker核心技术

来源:互联网 发布:linux shell 等待 编辑:程序博客网 时间:2024/04/30 06:38

《Docker技术入门与实践》 机械工业出版社

第十八章 Docker核心技术

Docker 归根到底是一种容器虚拟化技术。
本章介绍Docker的核心实现技术,包括架构、命名空间、控制组、联合文件系统、虚拟网络技术等话题。
早期版本Docker底层是基于成熟的Linux Container(LXC)技术实现的。自0.9版本起,还开始引进自家的libcontainer,试图打造更通用的底层容器虚拟库。
从操作系统功能上看,Docker底层依赖的核心技术主要包括Linux操作系统的命名空间(Namespace)、控制组(Control Groups)、联合文件系统(Union File Systems)和Linux虚拟网络支持。

1. 基本架构

Docker采用标准C/S架构,包括客户端和服务端两大部分。
客户端和服务端即可运行在一个机器上,也可通过 socket 或 RESTful API 进行通信。

1. 服务端

Docker daemon 一般在宿主主机后台运行,作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。
Docker daemon是一个非常松耦合的架构,通过专门的Engine模块来分发管理各自来自客户端的任务。
Docker 服务端默认监听本地的unix:///var/run/docker.sock套接字,只允许本地的root用户访问。可通过 -H 选项修改监听的方式。
此外,Docker 还支持通过HTTPS认证方式来验证访问。
注: Ubuntu 系统中,Docker服务端的默认启动配置文件在 /etc/default/docker

2. 客户端

Docker 客户端为用户提供一系列可执行命令,用户用这些命令实现与Docker daemon的交互。
用户使用的Docker可执行命令即为客户端程序。客户端发送命令后,等待服务端返回,收到返回后,客户端立即执行结束并退出。用户执行新的命令,需要再次调用客户端命令。
客户端默认通过本地的unix:///var/run/docker.sock套接字向服务端发送命令。若服务端没有监听到默认套接字,则需要客户端执行命令时显示指定,通过 -H 参数指定。

2. 命名空间

每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行。保证了容器间的互不影响。

1. 进程命名空间

Linux通过命名空间管理进程号,对同一进程,在不同的命名空间中,看到的进程号不同,每个进程命名空间有一套自己的进程号管理方法。
进程命名空间是一个父子关系的结构,子空间进程对父空间可见。新fork出的进程在父命名空间和子命名空间将分别有一个进程号来对应。

2. 网络命名空间

通过网络命名空间,可实现网络隔离。
网络命名空间为进程提供了一个完全独立的网络协议栈的视图。包括网络接口设备、IPv4和IPv6协议栈、IP路由表、防火墙规则、sockets等。
Docker采用虚拟网络设备(Virtual Network Device)方式,将不同命名空间的网络设备连接到一起。默认情况下,容器中的虚拟网卡将同本地主机的docker0网桥连接在一起。

3. IPC命名空间

容器中进程交互采用了Linux常见的进程间交互方法(Interprocess Communication IPC),包括信号量、消息队列和共享内存等。
PID命名空间和IPC命名空间可组合起来一起使用,同一个IPC名字空间内的进程彼此可见,允许交互;不同空间的进程无法交互。

4. 挂载命名空间

类似chroot,将一个进程放到特定目录执行。挂载命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间中的进程所看到的文件目录彼此隔离。

5. UTS命名空间

UTS(UNIX Time-sharing System)命名空间允许每个容器拥有独立的主机名和域名,从而可虚拟出一个有独立主机名和网络空间的环境。
默认情况下,Docker容器的主机名就是返回的容器ID。

6. 用户命名空间

每个容器可有不同的用户和组id,即可在容器内使用特定的内部用户执行程序,而非本地系统上存在的用户。
每个容器内部都可有root账号,跟宿主主机不在一个命名空间。

3. 控制组

控制组(CGroups)是Linux内核的一个特性,主要用于对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,Docker才能避免多个容器同时运行时的系统资源竞争。
控制组可提供对容器的内存、CPU、磁盘IO等资源进行限制和计费管理。
控制组的设计目标是为不同的应用情况提供统一的接口,从控制单一进程到系统级虚拟化。
具体,控制组功能:
* 资源限制(Resource Limiting)组可设置为不超过设定的内存限制。
* 优先级(Prioritization) 通过优先级让一些组优先得到更多的CPU等资源。
* 资源审计(Accounting)用于统计系统实际上把多少资源用到适合的目的上,可使用cpuacct子系统记录每个进程组使用的CPU时间。
* 隔离(Isolation)为组隔离名字空间,这样就不会看到另一个组的进程、网络连接和文件系统。
* 控制(Control)挂起、恢复和重启动等操作。
用户可在/sys/fs/cgroup/memory/docker/目录下看到对Docker组应用的各种限制项。

4. 联合文件系统

联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
联合文件系统是实现Docker镜像的技术基础。镜像可通过分层来进行继承。
Docker使用的AUFS(Another Union File System,或Advanced Multilayered Unification File System)就是一种联合文件系统。
AUFS支持为每一个成员目录设定只读、读写和写出权限,同时AUFS中有一个类似分层的概念,对只读权限的分支可逻辑上进行增量修改(不影响只读部分)。

5. Docker网络实现

利用了Linux上的网络命名空间和虚拟网络设备。

1. 基本原理

Docker的网络接口默认为虚拟的接口。虚拟接口最大优势即转发效率高。这是因为Linux通过在内核中进行数据复制实现虚拟接口间的数据转发,即发送接口的发送缓存中的数据包将呗直接复制到接收接口的接收缓存中,无需通过外部物理网络设备进行交换。

2. 网络创建过程

Docker创建容器时,具体执行如下操作:
* 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中。
* 本地主机一端的虚拟接口连接到默认的docker0网桥或指定网桥上,并具有一个以veth开头的唯一名字。
* 容器一端的虚拟接口将放到新创建的容器中,并修改名字作为eth0。这个接口只在容器的命名空间可见。
* 从网桥可用地址段中获取一个空闲地址分配给容器的eth0,并配置默认路由网关为docker0网卡的内部接口docker0的IP地址。
完成后,容器即可使用它所看到的eth0虚拟网卡来连接其他容器和访问外部网络。
另外,在docker运行时可通过 –net 参数指定容器的网络配置,可选值有:bridge、host、container和none。

3. 网络配置细节

用户使用 –net=none 后,Docker将不对容器网络进行配置。通过手动配置网络的整个过程,可以了解到Docker配置网络的更多细节。

当容器终止后,Docker会清空容器,容器内的网络接口会随网络命名空间一起被清除。

0 0