容器化初步——浅析 runc,containerd 和 docker

容器化技术很多人都不陌生,docker 作为一个运维和部署工具,已经快成为广大工程师的必备技能了。但是剖析docker 内部组件的文章却并不多。很多人可能不知道 docker 背后是由多个组件构成的,本文试图浅显地解释一下 docker 的几个核心组件,以及它们之间的关系。


runc


runc 是一个用来运行容器的命令行工具,没错,如果你只想运行一个“容器”,其实你并不需要 docker ,runc 就足够了,而且步骤相当简单。


为了介绍下面的部分,首先我们得理解一下容器是如何被描述的。为了被避免一个或多个商业公司垄断,容器的标准是由一个开放组织维护的,就是大名鼎鼎的 OCI(Open Container Initiative)。OCI 在 runtime-spec 这个仓库里描述了容器有关的具体标准(specification),各大厂家按照这个统一的标准做出来的各种组件,理论上就是可以通用的。统一标准而不是统一实现,这个思想和 Java 的 Servlet 以及 Python 的 WSGI 有异曲同工之妙。


OCI 定义的容器标准内容非常多,超出了这篇文章所想涉及的范畴,我们还是专注于实操。简单说一个容器的内容由两部分组成,一部分是config.json用来存放描述性信息,另一部分是 rootfs 根文件系统,包含容器内部的实际内容。用 runc spec 可以生成一个config.json

mkdir liu_container
cd liu_container
runc spec

目录下会生成一个config.json,内容如下:

{
"ociVersion": "1.0.2-dev",
"process": {
"terminal": true,
"user": {
"uid": 0,
"gid": 0
},
"args": [
"sh"
},
"..."
}

这个JSON里面就是容器的一些描述性信息。熟悉Linux的同学应该应该对rootfs不陌生,我们使用下面这个命令,获取一个docker镜像内部的rootfs:

cd liu_contaier
mkdir rootfs
docker export $(docker create alpine) | tar -C rootfs -xf -

然后我们就可以使用下面这个命令运行容器了:

cd liu_container
sudo runc run liu_container
/ #

当然这只是最基础的容器运行方法,不管是runc的配置还是命令行工具,都有大量的配置选项可供选择。通过这个部分我们应该了解了,总结一下,runc是一个运行容器的命令行工具,在底层为容器的运行提供了支持。

前面提到过,runc面向的是OCI的spec。因此实现并不是唯一的,和runc实现了相同接口的,还有包括谷歌的 gvisor 等其他工具等,感兴趣的可以了解一下。


Containerd


说完了runc,往上一层是containerd。熟悉Linux的同学应该知道,以d为结尾的程序,一般是守护进程。containerd就是一个管理容器的守护进程,它向下使用runc完成容器的执行,向上提供GPRC的API,方便完成各种管理操作。这里引用一张containerd官网的图片,用来描述containerd的架构:



还是进入实操,到contaienrd这个级别,我们已经可以直接进行image和container的管理了。containerd实现了OCI的镜像标准,也就是说我们不用自己拼rootfs,而是可以直接使用现成的alpine镜像了。


我们使用containerd的管理工具ctr,可以直接这样操作:

$ sudo ctr image pull docker.io/library/alpine:latest
$ sudo ctr image list
REF TYPE DIGEST SIZE PLATFORMS LABELS
docker.io/library/alpine:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126 3.2 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -

当然运行container也不在话下:

$ sudo ctr run -t docker.io/library/alpine:latest my_demo_container sh
/ #

查看当前运行的container:

$ sudo ctr container ls
CONTAINER IMAGE RUNTIME
my_demo_container docker.io/library/alpine:latest io.containerd.runc.v2

可以看到containerd的操作实际上和docker已经比较接近了,只不过containerd相对要更底层一些,对上层调用来说会更方便。例如containerd同时支持了Kubernetes的CRI接口标准,因此Kubernetes可以直接使用containerd作为容器runtime。


Docker


说了这么多终于到了大家最熟悉的docker。docker实际上背后也是使用了containerd,然后在上层封装了自己的命令行工具和其他组件。docker的操作就是最方便的了:

$ docker run -t alpine:latest sh
/ #

docker在containerd的基础增加了什么呢?简单说有这么几块:


  1. 方便的管理方式。docker在container的基础上,提供了cp,exec等命令,并且封装了volume和mount等操作,让我们无需接触底层的各种spec,也可以方便地完成容器有关的任务。
  2. 高级网络管理。docker中可以完成container和主机之间的各种端口映射操作,背后依托的是一个叫docker-proxy的额外程序。
  3. 提供Docker Engine API。Docker本身自己也是有一套API标准的,还有一些docker-py这样的SDK方便大家调用。


这篇文章到这就结束了,希望能让大家对docker背后的组件能有所了解。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
小刘
作者分享
对象是如何被创建的?
23
对象是如何被创建的?
23
入职不是上岸,学习没有终点 看到最近阿里又在裁员的消息,让我也想起了自己当年被阿里“拥抱变化”的故事。我人生中第一份实习来自阿里,踩的第一个“坑”就来自这份实习。 15年暑假我通过面试拿到了杭州天猫的iOS实习岗位,从哈尔滨飞到杭州,开启了人生中第一段实习。当时人也比较年轻,又进入了所谓的大厂,说实话是有一点飘的,当时已经决定以后留在阿里,留在杭州发展。 顺利入职之后,我开始了正常的实习工作,在天猫也确实学到了很多。美好的未来几乎快要在眼前慢慢展开了。结果实习三个月后,一封发给所有实习生的邮件,给了我当头一棒。马总这封题为“拥抱变化”的邮件,通知大家当年的实习生裁撤比例会超过往年,大批的实习生将不会留下。我成为了没有被留下的大多数人。 现在想想,实习留不下其实是一个非常正常的事。但对于当时涉世不深的我来说,这事儿仿佛是一个天大的打击。我非常慌张地在杭州又待了一个月,期间找到了网易在内的一些公司,参加了它们的面试看看有没有机会。不过由于一直在实习工作,事发突然,也没有什么准备时间,面试状态不好,各种面试都没有通过。眼看在杭州没有什么机会了,我只能灰溜溜地回到了河北老家。 当时在家里,整个人其实都是颓废的。说白了之前的路太顺了,没受过这种挫折。幸亏有爸妈的鼓励,让我重新找到了动力。经过一些面试,我找到了北京一家中小公司的iOS岗位,然后起身去北京实习。 小公司虽然比不上阿里,但是也能学到不少东西,在这家小公司里,我认识了后来帮了我很多的前辈,也学到了不少有用的技术知识。虽然小公司给的工资不如阿里,也没有所谓大厂“光环”,但是我心想着,起码是个工作,留在北京也不错。结果两个月之后,现实又给了我当头第二棒。这家小公司也没有让我留下,给出的理由到现在我都印象深刻:“我没有足够的正能量”。 怎么回事呢?后来我反思了一下自己,在技术层面大家对我都是认可的,但是在职场层面,当时的我年少轻狂,经常直接指出别人的代码和设计上的问题,语气上非常不留情面,有时候还会带着情绪。这样的表现,在小团队里或许确实是难以接受的。大家也可以自查一下,有没有类似的问题,如果有的话还是要尽快调整自己。 又没有留下,当时我已经开始怀疑自己了,为什么自己这么差呢?怎么办呢?没有办法,只能重新准备面试,后来经过几番辗转,最后我通过了猿题库(猿辅导)的面试。当时HR还是想让我实习一段,我以时间不充足为例拒绝了。而实际上,我是因为对实习这事有一些阴影了。毕业之后我入职了猿辅导,工作能力也没有让领导失望,承接了若干重要工作,我的职场之路终于算是顺利了一些。 说了这么多我的故事,我想有这么几点是可以对大家有用的: 1.挫折教育是我们的教育体系内缺失的一环。对没有背景的普通人来说,人生中十有八九是不如意的,越早认清这点,越早能避免挫折带来的负面影响,轻装上路。 2.否认自己不如提升自己。陷入到否认自己的情绪中,只会让自己更加焦虑。行动起来,才是缓解焦虑的最佳方法。 3.入职不是上岸。不管是实习还是正式,都有可能面临裁撤的风险,提升自己的能力,才能让自己有更宽广的选择空间。 4.学习没有终点。星球内很多同学都会提到在学校感觉很卷,而职场的卷想必大家都感受到了,强如阿里也会有被裁的风险。这种卷带来的影响就是,不学习就会落后。因此对未来保持适当的警惕感,能更加激励自己学习。 5.社会比职场还卷。像我们的鱼总已经不满足于在程序员这个群体卷了,先是进入自媒体领域和一帮博主卷,现在又开始创业,和更多对手展开商业上的竞争。鱼总能做到这点,背后付出的是很多人想象不到的努力。从这个角度看,鱼总确实是我们每个人的学习榜样。 最后送给大家一句忘了在哪儿看到的话: 当你对未来完全没有焦虑的时候,你应该有所担心。当你对未来过于焦虑的时候,你应该放宽心态。听起来很矛盾,但是很多事情就是要在黑和白中,找到那个灰。在焦虑和躺平中,找到每个人自己觉得最舒服的平衡点。 共勉。 #求职# #职场# #经验#
220
入职不是上岸,学习没有终点 看到最近阿里又在裁员的消息,让我也想起了自己当年被阿里“拥抱变化”的故事。我人生中第一份实习来自阿里,踩的第一个“坑”就来自这份实习。 15年暑假我通过面试拿到了杭州天猫的iOS实习岗位,从哈尔滨飞到杭州,开启了人生中第一段实习。当时人也比较年轻,又进入了所谓的大厂,说实话是有一点飘的,当时已经决定以后留在阿里,留在杭州发展。 顺利入职之后,我开始了正常的实习工作,在天猫也确实学到了很多。美好的未来几乎快要在眼前慢慢展开了。结果实习三个月后,一封发给所有实习生的邮件,给了我当头一棒。马总这封题为“拥抱变化”的邮件,通知大家当年的实习生裁撤比例会超过往年,大批的实习生将不会留下。我成为了没有被留下的大多数人。 现在想想,实习留不下其实是一个非常正常的事。但对于当时涉世不深的我来说,这事儿仿佛是一个天大的打击。我非常慌张地在杭州又待了一个月,期间找到了网易在内的一些公司,参加了它们的面试看看有没有机会。不过由于一直在实习工作,事发突然,也没有什么准备时间,面试状态不好,各种面试都没有通过。眼看在杭州没有什么机会了,我只能灰溜溜地回到了河北老家。 当时在家里,整个人其实都是颓废的。说白了之前的路太顺了,没受过这种挫折。幸亏有爸妈的鼓励,让我重新找到了动力。经过一些面试,我找到了北京一家中小公司的iOS岗位,然后起身去北京实习。 小公司虽然比不上阿里,但是也能学到不少东西,在这家小公司里,我认识了后来帮了我很多的前辈,也学到了不少有用的技术知识。虽然小公司给的工资不如阿里,也没有所谓大厂“光环”,但是我心想着,起码是个工作,留在北京也不错。结果两个月之后,现实又给了我当头第二棒。这家小公司也没有让我留下,给出的理由到现在我都印象深刻:“我没有足够的正能量”。 怎么回事呢?后来我反思了一下自己,在技术层面大家对我都是认可的,但是在职场层面,当时的我年少轻狂,经常直接指出别人的代码和设计上的问题,语气上非常不留情面,有时候还会带着情绪。这样的表现,在小团队里或许确实是难以接受的。大家也可以自查一下,有没有类似的问题,如果有的话还是要尽快调整自己。 又没有留下,当时我已经开始怀疑自己了,为什么自己这么差呢?怎么办呢?没有办法,只能重新准备面试,后来经过几番辗转,最后我通过了猿题库(猿辅导)的面试。当时HR还是想让我实习一段,我以时间不充足为例拒绝了。而实际上,我是因为对实习这事有一些阴影了。毕业之后我入职了猿辅导,工作能力也没有让领导失望,承接了若干重要工作,我的职场之路终于算是顺利了一些。 说了这么多我的故事,我想有这么几点是可以对大家有用的: 1.挫折教育是我们的教育体系内缺失的一环。对没有背景的普通人来说,人生中十有八九是不如意的,越早认清这点,越早能避免挫折带来的负面影响,轻装上路。 2.否认自己不如提升自己。陷入到否认自己的情绪中,只会让自己更加焦虑。行动起来,才是缓解焦虑的最佳方法。 3.入职不是上岸。不管是实习还是正式,都有可能面临裁撤的风险,提升自己的能力,才能让自己有更宽广的选择空间。 4.学习没有终点。星球内很多同学都会提到在学校感觉很卷,而职场的卷想必大家都感受到了,强如阿里也会有被裁的风险。这种卷带来的影响就是,不学习就会落后。因此对未来保持适当的警惕感,能更加激励自己学习。 5.社会比职场还卷。像我们的鱼总已经不满足于在程序员这个群体卷了,先是进入自媒体领域和一帮博主卷,现在又开始创业,和更多对手展开商业上的竞争。鱼总能做到这点,背后付出的是很多人想象不到的努力。从这个角度看,鱼总确实是我们每个人的学习榜样。 最后送给大家一句忘了在哪儿看到的话: 当你对未来完全没有焦虑的时候,你应该有所担心。当你对未来过于焦虑的时候,你应该放宽心态。听起来很矛盾,但是很多事情就是要在黑和白中,找到那个灰。在焦虑和躺平中,找到每个人自己觉得最舒服的平衡点。 共勉。 #求职# #职场# #经验#
215
Hello World是如何被打印的?
35
下载 APP