Containerd 容器技术详解
Containerd(container Daemon)是一个开源的容器运行时,它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由 Docker 开发团队创建的,并在后来成为一个独立的项目,被纳入了 cloudNative computing Foundation(云原生计算基金会 CNCF)的孵化项目中。以下是 containerd 的主要特点和功能:容器生命周期管理: Contain
这里写目录标题
Containerd 概述
什么是 containerd
Containerd(container Daemon)是一个开源的容器运行时,它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由 Docker 开发团队创建的,并在后来成为一个独立的项目,被纳入了 cloudNative computing Foundation(云原生计算基金会 CNCF)的孵化项目中。
以下是 containerd 的主要特点和功能:
容器生命周期管理: Containerd 管理容器的生命周期,包括容器的创建、运行、暂停、恢复、停止和销毁等操作。
标准化接口: Containerd 提供了一个标准化的容器运行时接口,使得它可以与多个容器编排系统和工具集成,例如Kubernetes、Docker Compose等。
镜像管理: 它支持容器镜像的拉取、推送、保存和加载等操作。containerd 使用 0CI(openContainer Initiative)规范定义容器镜像的格式
插件体系结构:Containerd 具有可扩展的插件体系结构,允许用户通过插件来扩展其功能,例如
存储驱动、网络插件等。跨平台支持: Containerd 可以在不同的操作系统上运行,从而提供了跨平台的支持。与 Kubernetes 集成: Containerd 作为 Kubernetes 的默认容器运行时,
与 Kubernetes 紧密集成,为容器工作负载的管理提供了良好的支持。
安全性和隔离: Containerd 实现了严格的容器隔离和安全性措施,确保容器之间的隔离性以及对主机系统的安全性。
总体而言,Containerd 提供了一个轻量级、高度可定制的容器运行时,为容器生态系统的发展提供了一个稳定和可靠的基础。它在容器生命周期管理、镜像管理和插件支持等方面为用户提供了丰富的功能
Containerd 的起源与背景
Containerd 的起源可以追溯到 Docker 项目。Docker最初作为个开源项目推出,旨在简化应用程序的打包、分发和部署过程。Docker 引入了容器的概念,将应用程序和其依赖项打包到一个容器中,使得应用在不同环境中可以一致地运行。
随着 Docker 的发展,其架构逐渐变得复杂,包含了许多功能,如镜像构建、服务编排等。为了更好地组织和管理这些功能,Docker团队决定将 Docker 引擎拆分成多个组件,其中一个关键的组件就是Con呇幄纞蹲枣殺偻獬譎嵬把密パ栾危啁釃閟凑幄酱ç咻娠墙纯rd.
Docker 架构拆分: Docker 从单一的大型引擎拆分为一系列小型、可复用的组件。这种拆分
的目标是提高可维护性、模块化和可扩展性。
Containerd 作为核心运行时:在 Docker 架构拆分后,containerd 被定位为 Docker 的核心容器运行时。它负责管理容器的生命周期、镜像操作和基本运行时功
贡献给 CNCF(云原生基金会):为了推动 Containerd 的发展,Docker 团队将 containerd 的代码捐赠给了 Cloud Native computing Foundation(CNCF),使其成为 CNCF 的孵化项目。
容器生态系统的标准化:Containerd 的设计遵循 Open container Initiative(开放容器倡议OCI)规范,这是一个关注容器运行时和镜像格式标准化的开放标准组织。这意味着 containerd 可以与符合 OCI 规范的其他容器工具和运行时进行互操作。
独立的容器运行时: containerd 不仅仅局限于 Docker,它可以作为独立的容器运行时,与多个容器编排系统和工具集成,从而为用户提供更多选择。
总体而言,containerd 的起源是为了简化容器运行时的管理,并为容器生态系统提供一个开放、标准化的基础。其发展不仅服务于 Docker 生态系统,还为整个容器领域提供了一个通用的、可扩展的容器运行时
Containerd 架构
Containerd 架构概述
Containerd 的架构是 modularity(模块化)和可扩展性的体现,它被设计为一个轻量级、高度
定制的容器运行时
可以看出 Containerd 采用的也是 C/S 架构,服务端通过 unix domain socket 暴露低层的 gRPCAPI 接口出去,客户端通过这些 API 管理节点上的容器,每个 Containerd 只负责一台机器,Pu11 镜像,对容器的操作(启动、停止等),网络,存储都是由 containerd 完成。具体运行容器由 runc 负资。
为了解耦,Containerd 将系统划分成了不同的组件,每个组件都由一个或多个模块协作完成(Core部分),每一种类型的模块都以插件的形式集成到Containerd 中
核心组件解析
Containerd 组件大致分为 Storage、Metadata 和 Runtime 这三个主要方面
storage(存储)
Content(内容)
功能: Content存储了容器镜像的实际数据。这包括文件系统层和元数据,用于创建和管理容器的基础文件系统。
Snapshot(快照)
功能:Snapshot 存储容器的快照数据。每个容器都可以有一个或多个快照,允许它们共享相同的文件系统层,提高效率。
Diff(差异)
功能: Diff 存储容器文件系统层之间的差异。当容器运行时需要修改文件系统时,会在已有的文件系统层上创建一个差异层,以保存变更
Metadata(元数据)
Images(镜像)
功能:Images 存储容器镜像的元数据,包括镜像的标签、大小、创建时间等信息。Metadata 中的 Images组件允许容器对镜像进行管理和操作。
Containers(容器)功能: Containers 存储容器的元数据,包括容器的状态、配置信息、网络设置等。这部分元数据使得容器能够有效地管理容器的生命周期
Runtime(运行时)
Tasks(任务)
功能: Tasks 包含容器内的进程组。每个容器运行时都有关联的 Task,它负责管理容器内的所有进程。
Tasks 与 Shim 一起工作,维护容器的状态。
Events(事件)
功能: Events 组件记录了容器的各种事件,如容器的创建、启动、停止等。这些事件可以用于监控和日志记录,帮助用户了解容器系统的运行状况
安装配置 Containerd
安装 containerd
添加软件源信息
[root@bogon ~]# curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 100 2081 100 2081 0 0 2352 0 --:--:-- --:--:-- --:--:-- 2354
[root@bogon ~]# sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
[root@bogon ~]# sed -i 's/$releasever/x86_64/g' /etc/yum.repos.d/docker-ce.repo
列出可用版本
[root@bogon ~]# yum list containerd.io --showuplicates
usage: yum list [-c [config file]] [-q] [-v] [--version]
[--installroot [path]] [--nodocs] [--noplugins]
[--enableplugin [plugin]] [--disableplugin [plugin]]
安装 containerd
[root@bogon ~]# yum -y install containerd.io
Docker CE Stable - x86_64 162 kB/s | 66 kB 00:00
Dependencies resolved.
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
containerd.io x86_64 1.6.32-3.1.el8 docker-ce-stable 35 M
Installing dependencies:
container-selinux noarch 2:2.230.0-1.oe2403sp1 OS 45 k
Transaction Summary
=============================================================================
Install 2 Packages
Total download size: 35 M
Installed size: 117 M
Downloading Packages:
[MIRROR] container-selinux-2.230.0-1.oe2403sp1.noarch.rpm: Curl error (60): SSL peer certificate or SSH remote key was not OK for https://repo.openeuler.openatom.cn/openEuler-24.03-LTS-SP1/OS/x86_64/Packages/container-selinux-2.230.0-1.oe2403sp1.noarch.rpm [SSL certificate problem: certificate is not yet valid]
(1/2): container-selinux-2.230.0-1.oe2403sp1 31 kB/s | 45 kB 00:01
(2/2): containerd.io-1.6.32-3.1.el8.x86_64.r 5.2 MB/s | 35 MB 00:06
-----------------------------------------------------------------------------
Total 4.9 MB/s | 35 MB 00:07
Docker CE Stable - x86_64 8.4 kB/s | 1.6 kB 00:00
Importing GPG key 0x621E9F35:
Userid : "Docker Release (CE rpm) <docker@docker.com>"
Fingerprint: 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
From : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: container-selinux-2:2.230.0-1.oe2403sp1.noarch 1/2
Installing : container-selinux-2:2.230.0-1.oe2403sp1.noarch 1/2
Running scriptlet: container-selinux-2:2.230.0-1.oe2403sp1.noarch 1/2
Installing : containerd.io-1.6.32-3.1.el8.x86_64 2/2
Running scriptlet: containerd.io-1.6.32-3.1.el8.x86_64 2/2
Running scriptlet: container-selinux-2:2.230.0-1.oe2403sp1.noarch 2/2
Running scriptlet: containerd.io-1.6.32-3.1.el8.x86_64 2/2
Verifying : containerd.io-1.6.32-3.1.el8.x86_64 1/2
Verifying : container-selinux-2:2.230.0-1.oe2403sp1.noarch 2/2
Installed:
container-selinux-2:2.230.0-1.oe2403sp1.noarch
containerd.io-1.6.32-3.1.el8.x86_64
Complete!
配置 containerd
生成配置文件
[root@bogon ~]# mkdir -p /etc/containerd/
[root@bogon ~]# containerd config default > /etc/containerd/config.toml
- sudo tee /etc/containerd/config.toml:
- tee 命令通常用来读取标准输入,并将其内容写入文件和输出到终端
- /etc/containerd/config.tom1是 containerd的配置文件路径,这里指定了配置文件的具体位置
- 使用 containerd config default 命令获取 containerd 的默认配置信息
- 通过管道|将这些配置信息传递给 tee 命令;
- 使用 sudo tee /etc/containerd/config.toml以管理员权限创建或覆盖/etc/containerd/config.tom1 文件,并将之前获取的配置信息写入其中
配置镜像加速
[root@bogon ~]# vim /etc/containerd/config.toml
sandbox image="registry.aliyuncs.com/google_containers/pause:3.9
config path="/etc/containerd/certs.d
SystemdCgroup =true
[root@bogon ~]# mkdir -p /etc/containerd/certs.d/docker.io
[root@bogon ~]# mkdir -p /etc/containerd/certs.d/registry.k8s.io
cat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
cat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
启动服务
[root@bogon ~]# systemctl restart containerd
[root@bogon ~]# systemctl status containerd
[root@bogon ~]# ctr version
Client:
Version: 1.6.32
Revision: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
Go version: go1.21.10
Server:
Version: 1.6.32
Revision: 8b3b7ca2e5ce38e8f31a34f35b2b68ceb8470d89
UUID: 629a98b2-9557-4c7d-8422-76435708b163
Containerd 基本操作
镜像类操作
拉取镜像
使用 ctr images pull 命令可以下载镜像
命令格式:
ctr images pull 镜像名称:[镜像标签]
全平台拉取镜像
[root@localhost ~]# ctr images pull docker.io/library/nginx:latest --all-platforms --hosts-dir=/etc/containerd/certs.d/
指定平台拉取镜像
[root@localhost ~]# ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
[root@bogon ~]# ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
docker.io/library/nginx:latest: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:13920fe73b382aa9017f7cf38b1377bc46ffb605fe980eb00f61aad26311ebf7: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:9bbbd7ee45b78c411208ea69e41a52a06a7e3872dfd0235e79bbb637e4789c1d: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:ee95256df0301df55618ec5c24f6bf41b6d005d3026e0e67e95fef0b0fbc2691: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:48670a58a68fc689138b916491d7c5aa6ea6fb2e4227a7edef275ec7003c9569: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:9592f5595f2b12c2ede5d2ce9ec936b33fc328225a00b3901b96019e3dd83528: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:ce7132063a5679c245d63b972b414a24de1686b42f8231c8df6f703c50a5ac38: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:3da95a905ed546f99c4564407923a681757d89651a388ec3f1f5e9bf5ed0b39d: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:23e05839d684c6d82bd5fd45968bb8997da3a639f1fe8ca502a4edbcffa8655d: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:6c8e51cf00871b029c189d3e2145e2307bbba361bb62e20b696c18b2e8cd2f52: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 0.5 s total: 0.0 B (0.0 B/s)
unpacking linux/amd64 sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc...
done: 11.092735ms
- ctr images pu1l:这是 ctr 工具用于拉取镜像的子命令
- docker.io/library/nginx:latest:指定要拉取的镜像,这里是 Docker Hub 上的官方 NGINX镜像的最新版本。
- –platform linux/amd64:指定要拉取的镜像平台为 Linux x86 64 架构。
- –hosts-dir=/etc/containerd/certs.d/:指定证书目录,用于存放私有镜像仓库的证书
查看镜像
查看本地有哪些镜像可以使用 ctr images ls,默认査看到的的是 default 命名空间的镜像
[root@bogon ~]# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
docker.io/library/nginx:latest application/vnd.oci.image.index.v1+json sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc 68.9 MiB linux/386,linux/amd64,linux/arm/v5,linux/arm/v7,linux/arm64/v8,linux/mips64le,linux/ppc64le,linux/s390x,unknown/unknown -
检测本地镜像
主要查看其中的 STATUS,complete 表示镜像是完整可用的状态
命令格式:
ctr images check
[root@bogon ~]# ctr images check
REF TYPE DIGEST STATUS SIZE UNPACKED
docker.io/library/nginx:latest application/vnd.oci.image.index.v1+json sha256:93230cd54060f497430c7a120e2347894846a81b6a5dd2110f7362c5423b4abc complete (8/8) 68.9 MiB/68.9 MiB true
重新打标签
命令格式:
ctr images tag 当前镜像名称 新镜像名称
[root@bogon ~]# ctr images tag docker.io/library/nginx:latest nginx:v1
nginx:v1
[root@bogon ~]# ctr images tag docker.io/library/nginx:latest nginx:v2
nginx:v2
删除镜像
命令格式:
ctr images rm 镜像名称:[镜像标签]
[root@bogon ~]# ctr images rm nginx:v2
nginx:v2
镜像挂载到主机目录
Containerd 可以把镜像直接挂载到宿主机的某个目录命令格式:
ctr images mount 镜像 挂载点
[root@bogon ~]# ctr images mount nginx:v1 /mnt
sha256:8f3a28fb15e024be11bb5558f29adeaa18f2087363187d7dbb3ea58140f9887c
/mnt
[root@bogon ~]# ls -l /mnt/
总计 68
lrwxrwxrwx. 1 root root 7 2025年 6月30日 bin -> usr/bin
drwxr-xr-x. 2 root root 4096 2025年 5月 9日 boot
drwxr-xr-x. 2 root root 4096 2025年 6月30日 dev
drwxr-xr-x. 1 root root 4096 2025年 7月 1日 docker-entrypoint.d
-rwxr-xr-x. 1 root root 1620 2025年 7月 1日 docker-entrypoint.sh
drwxr-xr-x. 1 root root 4096 2025年 7月 1日 etc
drwxr-xr-x. 2 root root 4096 2025年 5月 9日 home
lrwxrwxrwx. 1 root root 7 2025年 6月30日 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 2025年 6月30日 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 4096 2025年 6月30日 media
drwxr-xr-x. 2 root root 4096 2025年 6月30日 mnt
drwxr-xr-x. 2 root root 4096 2025年 6月30日 opt
drwxr-xr-x. 2 root root 4096 2025年 5月 9日 proc
drwx------. 2 root root 4096 2025年 6月30日 root
drwxr-xr-x. 3 root root 4096 2025年 6月30日 run
lrwxrwxrwx. 1 root root 8 2025年 6月30日 sbin -> usr/sbin
drwxr-xr-x. 2 root root 4096 2025年 6月30日 srv
drwxr-xr-x. 2 root root 4096 2025年 5月 9日 sys
drwxrwxrwt. 2 root root 4096 2025年 6月30日 tmp
drwxr-xr-x. 1 root root 4096 2025年 6月30日 usr
drwxr-xr-x. 1 root root 4096 2025年 6月30日 var
镜像从主机目录卸载
用于将挂载到宿主机的镜像卸载下来
命令格式:
ctr images unmount 挂载点
[root@bogon ~]# ctr images unmount /mnt/
/mnt/
如果无法卸载,可以使用以下方法
lsof /mnt/#列出所有使用 /mnt/的进程
fuser -mv /mnt/ #显示占用该挂载点的用户和进程
fuser -kmv /mnt/#强制终止占用 /mnt/ 的所有进程
镜像导出
该命令主要用于把镜像保存成文件
命令格式:
ctr images export --all-platforms 文件名 镜像名称:[镜像标签]
全平台导出
[root@bogon ~]# ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest
ctr: content digest sha256:604d5ba0d3cf08cac8a90605a0327b136a4960cd2512dcba79959423d08da9ea: not found
指定平台导出
[root@bogon ~]# ctr images export --platform linux/amd64 nginx_latest.tar docker.io/library/nginx:latest
镜像导入
该命令主要用于把文件加载为镜像
命令格式:
ctr images import 文件名
全平台导入
[root@bogon ~]# ctr images import --all-platform nginx_latest.tar
Incorrect Usage: flag provided but not defined: -all-platform
NAME:
ctr images import - import images
USAGE:
ctr images import [command options] [flags] <in>
指定平台导入
[root@bogon ~]# ctr images import --platform linux/amd64 nginx_latest.tarctr
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)