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

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,都能快速把它掌握。

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.