Docker的那些事儿—Docker使用的核心底层技术(5)


上一篇:Docker的那些事儿—Docker架构讲解(4)


Docker的那些事儿—Docker使用的核心底层技术(5)_第1张图片

Docker使用的核心底层技术:Namespace、Control Groups和Union FS。

Namespaces

每个docker主机上可以起很多container,这些container之间是相互隔离,互不影响的。Docker正是借助Linux kernel namespace(命名空间)来实现这一点。具体包括pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS("UNIX Time-sharing System")和用户空间隔离开。

pid namespace

进程是Linux操作系统中,一个重要的概念,它表示一个正在执行的程序。当执行ps命令后就可以打印当前系统中正在执行的进程。比如在我的Ubuntu-001中,有如下的结果:

Docker的那些事儿—Docker使用的核心底层技术(5)_第2张图片

当启动一个ubuntu的容器后,这行docker exec进入容器。可以看到容器内部执行ps后就打印出了三个进程。而上述在宿主机上却打印了几十个。这说明docker容器将容器内的进程与宿主机的进程成功的进行了隔离。

Docker的那些事儿—Docker使用的核心底层技术(5)_第3张图片

而宿主机上和docker相关的进程如下:

用如下图总结进程间的关系:

Docker的那些事儿—Docker使用的核心底层技术(5)_第4张图片

net namespace

有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过net namespace实现的, 每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge: docker0连接在一起。后面Docker 网络会着重讲解。

ipc namespace

容器中进程交互还是采用Linux常见的进程间交互方法(interprocess communication-IPC), 包括常见的信号量、消息队列和共享内存。然而同虚拟机不同的是,容器的进程间交互实际上还是host上具有相同pid namespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息——每个IPC资源有一个唯一的 32 位 ID。

mnt namespace

mnt namespace使得每个容器拥有自己的文件系统,有/bin、/boot、/etc等目录,有自己的挂载点。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个namespace 中的进程所看到的文件目录就被隔离开了。

Docker的那些事儿—Docker使用的核心底层技术(5)_第5张图片
Docker的那些事儿—Docker使用的核心底层技术(5)_第6张图片

uts namespace

UTS("UNIX Time-sharing System") namespace允许每个container拥有独立的hostname和domain name, 使其在网络上可以被视作一个独立的节点而非Host上的一个进程。

Docker的那些事儿—Docker使用的核心底层技术(5)_第7张图片

当docker run加-h参数时,就指定了容器主机的hostname;当然未加-h参数,容器主机的hostname默认为容器的短ID。

user namespace

每个container可以有不同的user和group id, 也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。在宿主机上创建用户sjyu,在容器内不能访问sjyu;同理在容器内创建用户sjyu1,在宿主机也不能访问。

Docker的那些事儿—Docker使用的核心底层技术(5)_第8张图片



下一篇:Docker的那些事儿—Docker使用的核心底层技术(6)



你可能感兴趣的:(Docker的那些事儿—Docker使用的核心底层技术(5))