互联网技术 / 互联网资讯 · 2023年12月1日 0

Docker底层原理快速了解,仅需5分钟

一位同学曾给我打比方:宿主机就好比一间大房子,dockeR把它成了N个小隔断。在这些小隔断之间,有独立的卫生间、小床、电视…

麻雀虽小,五脏俱全,这个比喻非常的贴切。linux提供了非常全面的隔离机制,使得每个小隔间互不影响。即使隔壁小间满室春光,我的小房间一样的冷清,对我毫无影响。

DockeR能实现这些功能,依赖于chRoot、naMespace、cgRoup等三种老技术。我们本篇文章,就先聊一下naMespace方面的东西。毕竟隔离是容器的第一要素。

5分钟快速了解Docker的底层原理

linux的内核,提供了多达8种类型的NaMespace。在这些独立的NaMespace中,资源互不影响,隔离措施做的非常好。

1. 8种类型

我们先来看一下,linux都支持哪些NaMespace。可以通过unshaRe命令来观察到这些细节。在终端执行Man unshaRe,将会出现这些NaMespace的介绍。

5分钟快速了解Docker的底层原理

Mount(Mnt) 隔离挂载点 PRoceSS ID (pid) 隔离进程 ID NetwoRk (net) 隔离网络设备,端口号等 InteRProceSS CoMMunication (iPC) 隔离 system V IPC 和 POSIX MeSSage queues UTS NaMespace(uts) 隔离主机名和域名 useR NaMespace (User) 隔离用户和用户组

另外,linux在4.6版本,5.6版本,分别加入了cgRoups和TiMe两种隔离类型,加起来就有8种。

ContRol gRoup (cgRoup) NaMespace 隔离 CgRoups 根目录 (4.6版本加入) TiMe NaMespace 隔离系统时间 (5.6版本加入)

2. 1个例子

通过unshaRe命令,可以快速建立一些隔离的例子,我们拿最简单直观的pid naMespace来看一下它的效果。

众所周知,linux进程号为1的,叫做sYsteMd进程。但在DockeR中,我们通过执行ps命令,却只能看到非常少的进程列表。

执行下面的命令,进入隔离环境,并将bash作为根进程:

unshaRe –pid –foRk –Mount-Proc /BIn/bash

效果如图所示。可以看到,我们的bash,已经成为了1号进程,而宿主机和其他隔离环境的进程信息,在这里是不可见的。

5分钟快速了解Docker的底层原理

先在隔离环境中,执行sLeep 1000。再开一个终端,在宿主机上执行pstRee,我们将会看到这个隔离环境的进行信息。

5分钟快速了解Docker的底层原理

接下来,在宿主机上,把sLeep对应进程的命名空间信息,和宿主机的命名空间信息作一下对比。可以看到,它们的pid naMespace,对应的数值是不同的。

5分钟快速了解Docker的底层原理

下面给出其他naMespace的实验性命令,你可以实际操作一下。

3. 试验一下

unshaRe –Mount –foRk /BIn/bash

创建Mount naMespace,并在每个不同的环境中,使用不同的挂载目录。

unshaRe –uts –foRk /BIn/bash

uts可以用来隔离主机名称,允许每个naMespace拥有一个独立的主机名,你可以通过hostnaMe命令进行修改。

unshaRe –iPC –foRk /BIn/bash

IPC NaMespace 主要是用来隔离进程间通信的。linux的进程间通信,有管道、信号、报文、共享内存、信号量、套接口等方式。使用了IPC命名空间,意味着跨NaMespace的这些通信方式将全部失效!不过,这也正是我们所希望的到的。

unshaRe –User -R /BIn/bash

用户命名空间,就非常好理解了。我们可以在一个NaMespace中建立xjjdog账号,也可以在另外一个NaMespace中建立xjjdog账号,而且它们是相互不影响的。

unshaRe –net –foRk /BIn/bash

net naMespace,这个就非常有用了。它可以用来隔离网络设备、IP 地址和端口等信息。

可以看到,通过各种NaMespace,linux能够对各种资源进行精细化的隔离。DockeR本身也是一个新瓶装旧酒的玩具。DockeR的创新之处,在于它加入了一个中央仓库,并封装了很多易用的命令。

你可能会发现,到目前为止,我们并没有对CPu和内存的资源使用进行隔离,也没有对应的NaMespace来解决这些问题。

资源限制的功能,是使用CgRoups进行限额配置来完成的,和NaMespACE没什么关系。我们将在后面的文章,介绍CgRoups这项技术。

5分钟快速了解Docker的底层原理

DockeR发展到现在,应用工具链已经非常成熟了,很多同学已经驾轻就熟,如果你对容器技术非常感兴趣,不如多看一下最底层的原理。这样,不管是谷歌推自己的容器,还是继续使用dockeR,都能快速把它掌握。