写点什么

docker 概念很乱?俺来替你理一下!

用户头像
胧月
关注
发布于: 3 小时前

docker 是什么?OCI 又是什么?CRI 又是什么?containerd 又 TM 是什么?有没有感觉概念非常的乱?

造成这一切乱象的根本,是各个利益公司之间的竞争造成的。商业竞争造成了用户的困扰,尤其是每个公司都在推销自己技术概念的时候。

接下来,俺将按照自己的理解方式,尝试为你解读这些操蛋的名词,让你对容器技术更多一些了解。如果你正在使用的是 docker,你会发现这个可怜的,容器时代的引领者,正在慢慢丢掉自己的所有。

Docker 并不是全部

自从 docker 加入了镜像仓库,引爆了容器技术,很多人认为 docker 就代表了容器的全部。这种观点很普遍,主要是由于 docker 实在是太火了。即使 k8s 二次官宣抛弃 docker,它的热度依然不减。

其实,现阶段,docker 只是众多容器技术中的其中一种。它有三个主要的概念。

  • 镜像  代表了最终的软件包,不可变的软件载体。相当于安装文件

  • 容器 镜像的运行时,实际运行的实例,具有明确的进程号

  • 仓库 存放镜像的仓库,可以进行统一的版本管理和权限管理

docker 是运行时和一堆开发工具集合的统称。docker-cli 就不必多说了,就是一堆命令行的集合,我们主要看一下运行时。



  • docker 我们平常操作 docker,使用的就是 docker 命令,它就是我们所说的命令行接口,相当于一个客户端。它将指令发送到 dockerd

  • dockerd docker 的服务端。比如我们在 Linux 上安装 docker,就要启动一个常驻进程,才能管理所有的 docker 进程

  • containerd 这个组件,是从 Docker1.11 版本才有的,是从 dockerd 里拆出来的,是容器标准化后的产物。它遵循的是 OCI 标准,这个标准后面我们还会用图来说明它的位置。containerd 功能齐全,换句话说,你的服务器上可以没有 dockerd,只需要 containerd 就能运行你的容器

  • runc 容器运行时组件,是一个标准的 OCI 容器实现运行时,可用来直接创建和运行容器。可以看到 containerd 和 runc 都是 OCI 的实现,区别是前者是管理工具,后者是运行容器

  • containerd-shim 垫片的意思,主要是将 containerd 与真正的容器进行解耦

  • ctr 也叫做 containerd-ctr,是 containerd 的客户端

你可能会特别奇怪,仅仅一个小小的 docker,怎么就分了这么多层!按照常理,俺只需要一个 client 端,一个守护进程就够了,怎么拆分了这么多层?

这是由于历史发展原因引起的。为了解耦,为了实现 OCI 标准,docker 的组件不得不拆了又拆,最后形成了一个松耦合的架构。后来,由于 k8s 加入竞争,又出现了一个新的名词:CRI。接下来,我们综合 k8s,来看一下各个组件所存在的层次。

两个标准割裂世界

为什么搞得这么复杂,主要是因为两个标准的加入。CRI 和 OCI。下面这张大图,大体体现了它们之间的关系。



OCI 全称是Open Container Initiative,定义得是容器运行时得标准。这个标准,使用 Linux 的 cgroup 和 namespace 等技术,和 docker 所使用的技术没什么两样。docker 只不过是 OCI 的一个实现而已,就像 gVisor(runsc)所实现的一样。

CRI 是全称是Container Runtime Interface,是 k8s 定义的一套与容器运行时进行交互的接口。containerd 就是 docker 为了适应这个标准而开发的 CRI 实现,但它已经是 CNCF 的了,不再属于 docker 了。

当然,除了 containerd 其他厂商也可以基于 CRI-O 做一些事情,同样实现了 CRI 接口。这样就可以无缝接入到 k8s 中,比如 redhat 的 OpenShift,就选用的 CRI-O。但对于容器的真正调度,其实还是 OCI 负责的,CRI 只是个中转站而已。比如,Podman,原来就是 CRI-O 项目的一部分,现在它可以直接操作 runc 来启动容器。

docker 整个体系,被两个标准拦腰斩了两次,组件多也就不足为怪了。

在早些版本中,k8s 为了支持 docker,不得不包含一个叫做 dockershim 的组件。后来,k8s 宣布不再支持 docker,其实是放弃了 dockershim 组件,我们依然可以使用 containerd 来调用 docker 的所有功能。

”k8s 不再支持 docker“,这种文字游戏,让很多人过早的放弃了 docker。

总结

2020 年 12 月 8 日,k8s 再次发布了弃用 docker 的文章。

https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/

这种文字游戏,无疑再次给 docker 以暴击。很多公司,其实运行的 docker 好好的,但主流调度系统这么一发声,就必须研究一些雷同的技术,来应对可能会出现的技术变革。

早在 2014 年,docker 的商业化态度还是非常强硬的,先后得罪了 coreos,redhat 等一系列组织,拒绝了 google 推出中立容器的合作。从关系亲密到反目成仇,也是让人无限感概。CNCF 云原生基金的成立,已经宣告了 docker 商业化的失败,docker 甚至自己搞了个开源版本moby。丢了编排调度,理念被 fork,这一切都让 docker 慢慢的丢掉自己的话语权。

事实证明,docker 的母公司,撑不起云原生这么大的蛋糕。大众还是希望选择一些巨人公司,然后匍匐在它的脚下。

这个选择,就是 CNCF,目前还是一个比较开放的组织。相比较而言,docker 是一个商业化产品。受益于开源,podman 定位于取代 docker,它是 redhat 出品。

不开源让你灭亡,是 docker 的最终结果。但开源呢?目前来看,开源界,绝大部分,不过是集体为 google,亚马逊,oracle 等几家巨头打免费的工罢了。


来源:https://mp.weixin.qq.com/s/7D1jczeZJuO9ugU0hPeCQA

用户头像

胧月

关注

还未添加个人签名 2021.08.17 加入

还未添加个人简介

评论

发布
暂无评论
docker概念很乱?俺来替你理一下!