<转载>什么是 Containerd-阿里云开发者社区

开发者社区> 阿里云容器服务 ACK> 正文
登录阅读全文

<转载>什么是 Containerd

简介: https://market.aliyun.com/products/56778013/cmgj018595.html?spm=5176.100239.blogcont133649.25.cdIARF

640_090402

我们过去曾就 containerd 的不同特点、它是如何设计的、以及我们在此过程中所解决的一些问题进行过几次讨论。

Containerd 已经被 Docker、Kubernetes CRI 和其他一些项目所使用。今天这篇文章,意在帮助读者理解 Containerd 实际上如何在这些平台上使用。将来我会写更多文章来介绍 containerd 的各种功能以及设计理念。不过,现在让我们先从一些基础知识开始吧。

我估计,容器生态系统时常让人感到迷惑。特别是我们所使用的术语。这是什么?一个运行时。这个呢?一个运行时...

从其名称看,containerd 并不是像某些人所调侃的那样 (contain nerd,字面意思“包含傻瓜”),而是一个容器守护程序。它最初是作为一种 OCI 运行时的整合点,如 runc,但在过去的 6 个月里,它增加了许多功能,使其满足 Docker 和 Kubernetes 等现代容器平台的需求。

640_090403_jpeg

由于在内核空间中没有 Linux 容器这样的东西,容器是各种内核功能捆绑在一起,当您在构建一个大型平台或分布式系统时,您想要在管理代码和系统调用之间的一个抽象层和一系列功能来运行一个容器。那就是 containerd 所在的层。它提供了一个客户端层,包含一些类型,平台可以在其上进行构建,而不需要下降到内核层。与管理对 clone() 或 mount() 的调用相比,使用 Container、Task 和 Snapshot 类型的工作要轻松得多。

Containerd 可用于 Docker、Kubernetes 以及任何其他希望抽象系统调用或 OS 特定功能的平台,以便在 Linux、Windows、Solaris 或其他操作系统上运行容器。考虑到这些用户,我们希望确保 containerd 只拥有他们需要的东西,而舍弃他们不想要的东西。实际上这不太可能,但至少我们会朝这一点进行努力。

比如,网络这样的事情超出了 containerd 的范围。原因是,当您构建分布式系统时,网络是一个非常重要的方面。随着 SDN 和服务发现的功能,网络更依赖于平台,而不是像 Linux 平台上抽象掉 netlink 调用那样简单。大多数新的覆盖网络都是基于路由的,并且每次创建或删除新容器时都需要更新路由表。服务发现、DNS 等都必须同时通知这些更改。如果我们将网络添加到 containerd,为了支持所有不同的网络接口、钩子和集成点,这将是非常大的一块代码。我们所做的是在 containerd 中选择一个强大的事件系统,这样多个客户就可以订阅他们关心的事件。我们还公开了一个任务 API,它允许用户创建一个正在运行的任务,能够向容器的网络命名空间添加接口, 然后启动容器的进程,而不必在容器的生命周期各个点上使用复杂的钩子。

在过去几个月中,添加到 containerd 的另一块功能是一个完整的存储和分发系统,支持 OCI 和 Docker 镜像格式。通过 containerd API,有一个完整的内容寻址存储系统,它不仅适用于镜像,还可用于元数据、检查点和附加到容器的任意数据。

我们还花了很多时间来重新思考 "graphdriver" 如何工作。这些是叠层或块级文件系统,允许镜像分层,从而使您可以执行高效的构建。Graphdriver 最初是由 Solomon 和我写的,当时我们增加了对 devicemapper 的支持。Docker 当时只支持 AUFS,因此我们在叠层文件系统之后设计了 graphdriver。然而,要想使一个块级文件系统 (如 devicemapper/lvm) 像叠层文件系统那样工作,实际上从长远来看更加困难。接口必须随着时间的推移而不断扩展,以支持不同的功能,而不只是我们最初认为需要的功能。使用 containerd,我们采取了不同的方法,使叠层文件系统运行起来更像一个快照程序,而不是反过来。由于叠层文件系统比快照文件系统 (如 BTRFS、ZFS 和 devicemapper) 提供了更大的灵活性,因为它们没有严格的父/子关系,因此这样做便容易许多。我们为快照程序构建了一个较小的接口,同时还满足了诸如生成器之类的需求,并减少了所需的代码量,从而更容易维护长期运行。

那么,通过使用 containerd,您能获得什么?
您可以获得 push 和 pull 功能以及镜像管理。
您可以获得容器生命周期 API 来创建、执行和管理容器及其任务。
您可以获得一个完整的 API,用于快照管理。

基本上,您拥有了构建一个容器平台所需的任何事情,而无需处理底层操作系统的细节。我认为 containerd 最重要的部分是有一个版本化和稳定的 API,并且可以将缺陷修复和安全补丁应用到之前的版本。

文章转载自:Docker官方公众号,原文链接

Docker 企业版在中国由我们的战略合作伙伴阿里巴巴提供
联系阿里云销售人员获取 Docker 企业版,或访问阿里云市场在线购买

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: