Containerd 学习笔记

Containerd 是一个工业级容器运行时,是 Kubernetes 和许多上层编排系统的基石。本笔记系统介绍 Containerd 的架构、安装、镜像与容器管理,以及 nerdctl/crictl 等生态工具的实践,所有案例代码均可直接运行。


1. Containerd 概述与架构

1.1 什么是 Containerd?

Containerd 最早是 Docker Engine 的内部组件,2016 年后独立为 CNCF 毕业项目,提供开放、稳定的容器运行基础设施。它并非面向最终用户,而是嵌入 Swarm、Kubernetes 等编排系统,通过 gRPC API 向上层暴露容器管理能力。

核心职责:每个节点上的镜像拉取、容器生命周期管理、网络、存储等。实际运行由 runc(或其他 OCI 兼容 runtime)负责。

1.2 发展简史

  • 2013 年:Docker 兴起,Google 希望合作构建统一容器运行时,遭拒。
  • 随后:Docker 将 libcontainer 捐给 OCI,更名为 runc。
  • 2016 年:Docker 推出 Swarm 对抗 Kubernetes,后不敌,于 2017 年原生支持 Kubernetes。
  • 2017 年:Docker 将 Containerd 捐给 CNCF。
  • Kubernetes 1.20:放弃内置 Docker shim,Containerd 成为 Kubernetes 容器运行时的首选。

1.3 Containerd 架构

Containerd 采用 C/S 架构,服务端通过 gRPC 提供稳定 API。各职能由插件化子系统协作完成,主要分为:

  • Bundle 子系统:从镜像中提取和打包 Bundle(容器的文件系统、配置和元数据)。
  • Runtime 子系统:执行 Bundle 以创建和运行容器。

主要插件类型

  • Content Plugin:管理镜像中不可变的内容。
  • Snapshot Plugin:管理镜像层的文件系统快照,类似 Docker 的 graphdriver。
  • Metrics Plugin:暴露各组件的监控指标。

整体可归纳为三大块:StorageMetadataRuntime

性能测试表明,Containerd 在容器启动、停止和删除等方面的总体性能优于 Docker 和 CRI-O。


2. Containerd 安装

环境:CentOS Stream 8

2.1 YUM 方式安装

bash

# 安装必要工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim

# 添加阿里云 Docker CE 源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache

# 安装 containerd
yum -y install containerd.io

# 启动并设置自启
systemctl enable containerd --now

# 验证版本
ctr version

2.2 二进制方式安装(cri-containerd-cni 包)

适用于 Kubernetes 集群,内置 runc 和 cni 插件。

bash

# 下载二进制包(包含 runc 和 cni)
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz

# 解压并安装
mkdir containerd
tar xf cri-containerd-cni-1.6.32-linux-amd64.tar.gz -C containerd/
cd containerd
cp usr/local/bin/* /usr/local/bin
cp etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service

# 生成默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml

# 启动
systemctl enable containerd --now
可选:单独安装 runc

bash

wget https://github.com/opencontainers/runc/releases/download/v1.3.0/runc.amd64
mv runc.amd64 /usr/sbin/runc
chmod +x /usr/sbin/runc
runc -v

3. Containerd 镜像管理(ctr 命令)

ctr 是 Containerd 原生调试客户端。注意:命令默认命名空间为 default,需要指定镜像完整 URL。

3.1 帮助命令

bash

ctr --help
ctr images --help

3.2 查看镜像

bash

ctr images ls                # 可简写为 ctr i ls

3.3 下载镜像

bash

ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest
ctr images ls

3.4 镜像挂载与卸载

bash

ctr images mount <镜像全名> /mnt
ls /mnt
umount /mnt

3.5 镜像导出

bash

ctr i export --platform linux/amd64 nginx.tar <镜像全名>

3.6 镜像删除

bash

ctr image rm <镜像全名>

3.7 镜像导入

bash

ctr images import --platform linux/amd64 nginx.tar

3.8 修改镜像标签

bash

ctr images tag <原镜像> nginx:latest

4. Containerd 容器管理(ctr 命令)

4.1 命令帮助

bash

ctr container --help
ctr run --help

4.2 静态容器与动态容器

  • 静态容器:只初始化了资源(namespaces、rootfs),进程未启动。
  • 动态容器:进程已运行。

4.3 创建与运行容器

bash。

# 创建静态容器
ctr container create nginx:latest nginx1
ctr container ls

# 启动为动态容器(后台运行)
ctr task start -d nginx1
ctr task ls               # 显示 PID 和状态
ps aux | grep <PID>       # 容器进程在宿主机上可见

4.4 直接运行一个动态容器

bash

ctr run -d --net-host nginx:latest nginx2   # --net-host 共享宿主机网络

4.5 进入容器执行命令

bash

ctr task exec --exec-id $RANDOM -t nginx1 /bin/sh

4.6 暂停与恢复容器

bash

ctr tasks pause nginx2
ctr task ls                # STATUS: PAUSED
ctr tasks resume nginx2

4.7 停止与删除容器

bash

ctr tasks kill nginx2
ctr tasks delete nginx2    # 必须先停止 task 才能删除
ctr container delete nginx2

5. 使用私有容器镜像仓库(Harbor)

bash

# 配置 hosts 或 DNS 解析
echo "192.168.108.30 my.harbor.com" >> /etc/hosts

# 拉取镜像(指定 http 协议)
ctr image pull --plain-http 192.168.108.30/cloud/nginx:latest

# 推送镜像到 Harbor
ctr images tag nginx:latest my.harbor.com/cloud/nginx:latest
ctr image push --platform linux/amd64 --plain-http \
  --user "images_admin:Cloud12#$" my.harbor.com/cloud/nginx:latest

6. Containerd 命名空间(Namespace)

命名空间隔离容器和镜像,实现多租户管理。默认命名空间为 default,Docker 环境额外使用 moby

bash

# 列出命名空间
ctr namespace ls

# 创建/删除命名空间
ctr namespace create myns
ctr namespace rm testns

# 在指定命名空间中操作
ctr -n myns images pull <镜像>
ctr -n myns container create <镜像> mynginx
ctr -n myns task start -d mynginx
ctr -n myns tasks ls

7. nerdctl 实践

nerdctl 是 Docker CLI 兼容的 Containerd 客户端,语法与 Docker 高度一致。

7.1 安装与配置

bash

# 下载 nerdctl
wget https://github.com/containerd/nerdctl/releases/download/v1.4.0/nerdctl-1.4.0-linux-amd64.tar.gz
tar -xf nerdctl-1.4.0-linux-amd64.tar.gz -C /usr/bin/

# 安装 cni 插件
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
mkdir -p /opt/cni/bin
tar -xf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

# 命令补全
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl

# 可能需安装 bash-completion
yum install -y bash-completion

7.2 配置镜像加速

编辑 /etc/containerd/config.toml,在 plugins."io.containerd.grpc.v1.cri".registry 下设置 config_path = "/etc/containerd/certs.d",然后创建加速文件:

bash

mkdir -p /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml

内容:

toml

server = "https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"
[host."https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull", "resolve"]

重启:systemctl restart containerd

7.3 镜像管理(nerdctl)

bash

nerdctl image ls        # 查看本地镜像
nerdctl pull busybox    # 下载镜像
nerdctl tag busybox busybox_containerd   # 打标签
nerdctl save busybox -o busybox.tar      # 导出镜像
nerdctl load -i busybox.tar              # 导入镜像
nerdctl rmi busybox                      # 删除镜像
nerdctl image history busybox            # 查看镜像历史层
nerdctl image inspect busybox            # 查看详细信息
nerdctl image prune --all --force        # 删除所有未使用镜像

7.4 容器管理(nerdctl)

bash

nerdctl run -it --rm busybox sh          # 运行容器
nerdctl ps -a                            # 列出所有容器
nerdctl run -d --name nginx1 nginx       # 后台运行命名容器
nerdctl logs nginx1                      # 查看日志
nerdctl exec -it nginx1 bash             # 进入容器
nerdctl cp /etc/hostname nginx1:/        # 复制文件到容器
nerdctl inspect nginx1                   # 查看容器详情
nerdctl stop/start/restart nginx1        # 停止/启动/重启
nerdctl pause/unpause nginx1             # 暂停/恢复
nerdctl kill nginx1                      # 强制停止
nerdctl rm nginx1                        # 删除容器
nerdctl container prune --force          # 清理所有已停止容器
nerdctl rename nginx1 new_name           # 重命名容器
nerdctl commit nginx nginx_containerd    # 提交容器为新镜像
nerdctl run -d -p 8080:80 --name web nginx
nerdctl port web                         # 查看端口映射

7.5 网络管理

bash

nerdctl network ls
nerdctl network inspect bridge
# 默认网桥 nerdctl0,容器默认从 10.4.0.0/24 获取 IP

7.6 存储管理

支持 bind mount 和 docker managed volume:

bash

nerdctl run -d -v /data:/data busybox -- sleep infinity
nerdctl volume ls
nerdctl volume inspect <volume_name>

7.7 命名空间管理

bash

nerdctl namespace ls
nerdctl namespace create myns
nerdctl namespace rm myns

8. crictl 实践

crictl 是遵循 Kubernetes CRI 接口的命令行工具,用于调试和检查容器运行时。

8.1 安装与配置

bash

# 配置 Kubernetes 源后安装
yum install -y cri-tools

# 配置 /etc/crictl.yaml
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

8.2 常用命令

bash

crictl pull httpd                  # 拉取镜像
crictl images                      # 列出镜像
crictl ps -a                       # 列出容器
crictl inspect <容器ID>            # 查看容器详情
crictl logs <容器ID>               # 查看日志
crictl exec -it <容器ID> /bin/bash # 进入容器
crictl rm <容器ID>                 # 删除容器
crictl rmi <镜像ID>                # 删除镜像
crictl stats                       # 查看资源使用

9. 多工具命令对照速查表

功能 docker podman nerdctl ctr crictl
查看容器状态 docker ps podman ps nerdctl ps ctr task ls / ctr c ls crictl ps
查看镜像 docker images podman images nerdctl images ctr image ls crictl images
查看容器日志 docker logs podman logs nerdctl logs crictl logs
查看容器信息 docker inspect podman inspect nerdctl inspect ctr c info crictl inspect
查看容器资源 docker stats podman stats nerdctl stats crictl stats
运行新容器 docker run podman run nerdctl run ctr run 无(组合 create/start)
修改镜像标签 docker tag podman tag nerdctl tag ctr image tag
创建新容器 docker create podman create nerdctl create ctr c create crictl create
导入镜像 docker load podman load nerdctl load ctr image import
导出镜像 docker save podman save nerdctl save ctr image export
删除容器 docker rm podman rm nerdctl rm ctr c rm crictl rm
删除镜像 docker rmi podman rmi nerdctl rmi ctr image rm crictl rmi
拉取镜像 docker pull podman pull nerdctl pull ctr image pull crictl pull
推送镜像 docker push podman push nerdctl push ctr image push
容器内执行命令 docker exec podman exec nerdctl exec crictl exec

实用技巧:如果习惯 Docker 命令,可执行 alias docker=nerdctl 获得近乎一致的体验。


本笔记完整覆盖 Containerd 核心操作,掌握后即可在 Kubernetes等场景中高效管理容器运行时。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐