自下而上学习容器

作者丨iximiuz
译者丨屠灵
策划丨闫园园
我从2015年开始使用容器 , 我对容器最初的理解就是把它们看成是轻量级的虚拟机 , 只是启动时间比虚拟机快了很多 。 脑子里有了这样的概念 , 就很容易看懂网上那些关于如何将Python或Node应用程序装入容器的教程 。 但很快 , 我意识到仅仅将容器看成是轻量级的虚拟机有点跳过简单化了 , 这导致我无法对以下这些问题做出判断:
容器可以做什么以及不可以做什么;
哪些是使用容器的最佳实践以及哪些不是;
哪些东西放在容器是安全的以及哪些不是 。
既然“容器就是虚拟机”这种理解有失偏颇 , 我就开始深入探究 , 看看容器到底是什么 , 而Docker无疑是最好的切入点 。 问题是 , Docker是一个可以用来做各种各样事情的庞然大物 , 而运行它的命令又如此简单(比如dockerrunnginx) , 很容易就蒙蔽了我们 。 与Docker相关的资料有很多 , 它们要么是太过浅显的教程 , 要么太多艰深 , 新手根本就看不懂 。
于是 , 我花了一些时间 , 为读者铺平了学习容器的道路 。
多年来 , 我尝试从不同的角度探究 , 终于找到了一条适合我的学习路径 。 不久前 , 我在推特上分享了我的学习路径 , 引起了很多人的共鸣 。
本文并不打算一次性解释完所有有关容器的东西 。 相反 , 它是我多年来对这个领域探究的一道“前菜” 。 它介绍了我的学习路径 , 你可以顺着这条路径 , 再去阅读其他更加深入介绍容器的文章 。
掌握容器知识不是一项简单的任务 , 所以慢慢来 , 不要跳过实操的部分!
1
容器学习路径
我发现按照下面这样的顺序来学习容器非常有效:
Linux容器——学习底层的实现细节;
容器镜像——了解什么是镜像以及为什么需要镜像;
容器管理器——了解Docker是如何管理单台主机上的容器的;
容器编配器——了解Kubernetes是如何管理集群里的容器的;
非Linux容器——了解其他容器实现 , 打开更大的视野 。
2
容器不是虚拟机
容器是一种隔离(命名空间)且受约束(通过cgroups、capabilities、seccomp)的进程 。
上面的这个解释非常有助于我理解什么是容器 。 当然 , 这个解释并非绝对准确 , 当你读到这篇文章的末尾你就会知道 , 但在刚开始学习容器时 , 这样的解释是很合适的 。
自下而上学习容器
文章图片
要在Linux上启动一个进程 , 需要fork/exec它 。 但要启动一个容器化的进程 , 要先创建命名空间、配置cgroups , 等等 。 或者 , 换句话说 , 为进程准备一个箱子 , 让进程在箱子里运行 。 容器运行时就是一种用来创建这种箱子的工具 。 容器运行时知道怎样准备好箱子 , 然后在箱子里启动一个容器化的进程 。 又因为大多数运行时都遵循常用的规范 , 容器就成为一种标准的工作负载单元 。
使用最广的容器运行时是runc 。 runc是一种普通的命令行工具 , 所以可以在没有Docker或其他高级容器软件的情况下直接使用它 。
自下而上学习容器
文章图片
runc启动一个容器化进程的过程
我对此感到兴奋万分 , 甚至还写了一系列关于容器运行时垫片(shim)的文章 。 垫片是指底层容器运行时(如runc)和高级容器管理器(如containerd)之间的一种软件 。 要做好垫片 , 需要对运行时了如指掌 , 所以这一系列文章先从深入分析使用最为广泛的容器运行时开始 。
容器运行时垫片