容器技术 三问:这是什么?为什么?如何做?

这篇文章《The What, Why and How of Containers – Annwan》主要探讨了容器技术的起源、发展以及在Linux系统中的实现方式。文章通过历史的角度,介绍了操作系统级虚拟化技术的发展,特别是在UNIX和Linux系统上的演进。

问题起源与早期解决方案

文章首先提到了chroot,这是一个自UNIX早期版本就存在的内核机制,允许以一个特殊的根目录运行进程。这个机制使得进程可以共享内核和硬件资源,但只能访问文件系统的一个子树。

FreeBSD Jails

随后,文章介绍了FreeBSD在2000年引入的Jails机制。FreeBSD Jails在chroot的基础上增加了对系统资源(除了文件系统之外)的隔离和控制,从而实现了一个完整的容器化解决方案。

Linux的cgroups和Namespaces

文章接着讨论了Linux系统中的Control Groups(cgroups)和Namespaces。cgroups是Linux的一个机制,用于控制进程及其子进程可以使用多少系统资源,最初并不是为了虚拟化而设计,而是为了解决进程争抢硬件资源的问题。Namespaces则允许在特定全局资源(如挂载点、进程ID、用户ID、进程间通信、网络或时间)方面隔离进程。

容器的实现

利用chroot、cgroups和Namespaces这些机制,文章描述了如何在Linux系统中创建一个容器。创建过程包括准备容器将要访问的文件系统子树,创建所需的所有命名空间,以及在命名空间内运行容器化进程。

结论

文章最后指出,实际上我们不需要从零开始创建容器,因为已经有人开发了具有更好用户界面的容器管理系统,如Docker、LXC和systemd-nspawn等,这些系统可能正好适合不同的使用场景。

By Kimi

我一直觉得容器技术发展的心路历程是(仅供娱乐):

  1. 老板叫我在服务器上跑个 XXX 服务
  2. md 怎么又缺依赖库、又有包冲突、又把服务器环境搞坏了?
  3. 干脆开个虚拟机来跑得了
  4. 虚拟机下镜像、装系统、配设备好麻烦……只是想要一个独立的环境啊,怎么这么麻烦
  5. 诶,既然只是需要隔离环境,有没有更轻量的办法?
  6. 隔离的本质就是让程序看不到其他进程和目录,只要做好这两者的隔离不就行了,何苦跑个完整的系统?
  7. 利用 cgroup/namespace(进程隔离)和 chroot(文件系统隔离)的容器技术横空出世
  8. 这套技术既然天天搁在一起用,干脆合并一下好了。就叫 LXC(Linux Container)吧
  9. LXC 还是配起来太麻烦了,要敲一堆命令。有没有办法一行命令部署任何东西?好了,就叫它 Docker 吧
  10. Docker 这套内核接口没必要强求 LXC,性能不够高。包装一下系统接口,库名叫 runc 吧
  11. Docker 怎么完全商业化了?这不行,核心技术要掌握在所有人手里!Container Spec 开放规范、crun 运行时、Podman 等问世
2 个赞

啊哈哈哈哈哈差不多,我也这样想的。