五分钟搞定Docker底层原理

五分钟搞定Docker底层原理

作者:小姐姐味道 2021-12-01 06:50:50

云计算

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

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

[[437703]]

图片来自 包图网

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

Docker 能实现这些功能,依赖于 chroot、namespace、cgroup 等三种老技术。

我们本篇文章,就先聊一下 namespace 方面的东西。毕竟隔离是容器的第一要素。

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

8 种类型

我们先来看一下,Linux 都支持哪些 Namespace。可以通过 unshare 命令来观察到这些细节。

在终端执行 man unshare,将会出现这些 Namespace 的介绍:

  • 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 版本加入)。

1 个例子

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

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

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

  1. unshare --pid --fork --mount-proc /bin/bash 

效果如图所示:

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

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

接下来,在宿主机上,把 sleep 对应进程的命名空间信息,和宿主机的命名空间信息作一下对比。

可以看到,它们的 pid namespace,对应的数值是不同的。

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

试验一下

  1. unshare --mount --fork /bin/bash 

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

  1. unshare --uts --fork /bin/bash 

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

  1. unshare --ipc --fork /bin/bash 

IPC Namespace 主要是用来隔离进程间通信的。Linux 的进程间通信,有管道、信号、报文、共享内存、信号量、套接口等方式。

使用了 IPC 命名空间,意味着跨 Namespace 的这些通信方式将全部失效!不过,这也正是我们所希望的到的。

  1. unshare --user -r /bin/bash 

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

  1. unshare --net --fork /bin/bash 

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

结语

可以看到,通过各种 Namespace,Linux 能够对各种资源进行精细化的隔离。

Docker 本身也是一个新瓶装旧酒的玩具。Docker 的创新之处,在于它加入了一个中央仓库,并封装了很多易用的命令。

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

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

最后,附上 Docker 的一张生命周期图:

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

作者:小姐姐味道

编辑:陶家龙

来源:转载自公众号小姐姐味道(ID:xjjdog)

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/255263.html<

(0)
运维的头像运维
上一篇2025-04-30 18:26
下一篇 2025-04-30 18:27

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注