容器运行底层技术分析

type
status
date
slug
summary
tags
category
icon
password
name
😀
前几次面试的不乏问到了Docker之类的容器化具体用到了Linux的什么技术,恰好今天看到阮一峰的博客投稿中有一篇英文文章,于是顺着文章看了一遍,想着自己也再记录一遍。

容器的内容、原因和方式

Ps.UNIX 和 Linux 上操作系统级虚拟化的历史

问题

notion image

一切都以 chroot 开始(UNIX,1982)

Chroot 是自 UNIX 早期版本以来可用的一种内核机制,它允许像使用备用根目录一样运行进程。该进程共享内核和硬件,但只能访问文件系统的子树。
notion image
FreeBSD 监狱(jails)基本上采用 chroot 并在其基础上添加机制来隔离和控制文件系统之外的其他系统资源的使用。
最终结果是一个内核机制,它是一个完整的容器实现:
  • 完全(或多或少,取决于监狱的具体配置)隔离的用户空间
  • 与主机运行在相同的内核上
notion image

快速切线:控制组 (cgroups)(Linux,2007 年,2016 年重大更新)

控制组是 Linux 中的一种机制,允许控制进程(及其子进程)可以使用多少系统资源。
它最初并不是用于虚拟化,而是作为一个系统来避免进程争夺硬件并实施配额。然而,当涉及到实现容器时,它被证明非常有用。

命名空间(Linux,从 2002 年开始)

命名空间允许将命名空间内的进程与其他特定的全局资源(例如挂载点、进程 ID、用户 ID、进程间通信、网络或时间)隔离。
但更重要的是,它们还允许跨 cgroup 进行隔离,给人一种系统上孤身一人的错觉。

如何制作Linux容器

有了这些机制(chroot、cgroups和命名空间),创建容器在概念上相对简单:
首先,你需要准备好容器将要访问的子树,准备进行chroot操作。 然后,为你需要隔离的所有内容创建命名空间(这通常至少包括PID、UID、挂载点和cgroups)。 最后,在你的命名空间内,将你的容器化进程运行在其子树中,已经进行了chroot操作。

结论

notion image
在实践中,不需要从头开始制作它们,人们已经制作了具有更好的用户界面的管理容器的系统。其中包括 Docker、LXC 和 systemd-nspawn 仅举几例,并且可能有一个适合的用例。

来源

  • Comic bits inspired by the awesome XKCD
 
Loading...

© Dreamin 2021-2025