Docker 容器技术

从操作系统功能上看,Docker底层依赖的核心技术主要包括Linux操作系统的命名空间(Namespaces)、控制组(Control Groups)、联合文件系统(Union File Systems)和Linux虚拟网络支持。

基本架构

Docker 采用了标准的C/S架构,包括服务端和客户端两大部分。

服务端:

Docker daemon一般在宿主主机后台运行,作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。在设计上,Docker daemon是一个非常松耦合的架构,通过专门的Engine模块来分发管理各个来自客户端的任务。

客户端:

Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现与服务器端的交互。





命名空间

命名空间(Namespace)是Linux内核针对实现容器虚拟化而引入的一个强大特性。每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。

在操作系统中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等资源,所有的资源都是应用进程直接共享的。

Linux通过命名空间,让某些进程在彼此隔离的命名空间中运行。虽然,这些进程都共用一个内核和某些运行时环境,但是彼此是不可见的----它们都认为自己是独占系统的。

进程命名空间
网络命名空间
IPC命名空间
挂载命名空间
UTS命名空间
用户命名空间

控制组

控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,Docker才能避免多个容器同时运行时的系统资源竞争。

控制组提供如下功能:
资源限制(Resource Limiting)可以设置为不超过设定的内存限制。
优先级(Prioritization)通过优先级让一些组有限得到更多的CPU等资源。
资源审计(Accounting)用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。
隔离(Isolation)为隔离名字空间,这样一个组不会看到另一个组的进程、网络连接和文件系统。
控制(Control)控制挂起、恢复和重启动等操作。

联合文件系统

联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同事可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是实现Docker镜像的技术基础。镜像可以通过分层来进行继承。

当Docker利用镜像启动一个容器时,将利用镜像分配文件系统并且挂载一个新的可读写的层给容器,容器会在这个文件系统中创建,并且这个可读写的层被添加到镜像中。

Docker网络实现

Docker的网络实现就是利用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair)。

要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包。

Docker中的网络接口默认都是虚拟的接口。虚拟接口的最大优势就是转发效率极高。这是因为Linux通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口发送缓存中的数据包将被直接复制到接收接口的接收缓存中,而无需通过外部物理网络设备进行交换。对于本地系统和容器内系统来看,虚拟接口跟一个正常的以太网卡相比并无区别,只是它速度要快的多。

Docker容器网络就很好地利用了Linux虚拟网络技术。它在本地主机和容器内分别创建一个虚拟接口,并让他们彼此连通(这样的一对接口叫做veth pair)。








猜你喜欢

转载自maosheng.iteye.com/blog/2372643