Containerd

一、Containerd 基础介绍

1. 核心定位与目标

  • 独立开源的容器运行时基础设施,脱胎于 Docker Engine,2017 年捐给 CNCF,2020 年后成为 Kubernetes 主流容器运行时(K8s 1.20+ 取消对 Docker shim 维护,Containerd 无缝对接 CRI)。
  • 非面向最终用户,专注集成到上层编排系统(Swarm、Kubernetes、Mesos 等),提供稳定的容器运行时能力。
  • 核心功能:容器生命周期管理、镜像传输与管理、存储与网络管理,支持所有 OCI 标准容器。

2. 性能优势

  • 对比 Docker、CRIO,Containerd 在容器启动、停止、删除等操作上性能更优(基于 bucketbench 测试),架构更轻量、易管理。

二、Containerd 架构

1. 核心架构设计

  • 采用 C/S 架构:服务端通过 gRPC 提供 API,客户端(如 ctr、nerdctl)调用 API 实现操作。
  • 两大子系统:
    • Bundle 子系统:处理容器文件系统(配置、元数据、根文件系统数据)的提取与打包。
    • Runtime 子系统:执行 Bundle,负责容器创建等运行时操作。
  • 核心模块划分:Storage(存储)、Metadata(元数据)、Runtime(运行时),通过插件化集成,插件间相互依赖。

2. 常用核心插件

  • Content Plugin:存储镜像的不可变可寻址内容。
  • Snapshot Plugin:管理镜像文件系统快照(类似 Docker 的 graphdriver)。
  • Metrics Plugin:暴露组件监控指标。
  • Runtime Plugin:对接 runC、kata 等运行时工具。
  • GC Plugin:负责垃圾回收,清理无用资源。

三、Containerd 安装(CentOS Stream 8)

1. YUM 方式安装(推荐,简单高效)

# 1. 安装依赖工具
yum install -y yum-utils device-mapper-persistent-data lvm2 vim

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

# 3. 安装 containerd.io(含 Containerd 核心)
yum -y install containerd.io

# 4. 验证安装
rpm -qa | grep containerd

# 5. 启动并设置开机自启
systemctl enable containerd --now
systemctl status containerd

# 6. 验证命令可用性(ctr 为内置 CLI)
ctr version

2. 二进制方式安装(适合 K8s 集群场景)

(1)安装包选择
  • 基础包(containerd-xxx):无 runC,需单独安装。
  • 完整包(cri-containerd-cni-xxx):含 runC、K8s 所需文件,依赖系统 seccomp。
(2)安装步骤
# 1. 下载完整安装包(以 v1.6.32 为例)
wget https://github.com/containerd/containerd/releases/download/v1.6.32/cri-containerd-cni-1.6.32-linux-amd64.tar.gz

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

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

# 4. 安装 runC(二进制包含 runC,但需 seccomp 支持)
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  # 验证

# 5. 启动服务
systemctl daemon-reload
systemctl enable containerd --now

四、Containerd 核心操作(ctr 命令)

1. 镜像管理

操作 命令示例
查看镜像 ctr images list / ctr i ls
拉取镜像 ctr images pull 054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com/library/nginx:latest
挂载镜像(查看内容) ctr images mount 镜像REF /mnt
卸载镜像 umount /mnt
导出镜像 ctr i export --platform linux/amd64 nginx.img 镜像REF
导入镜像 ctr images import --platform linux/amd64 nginx.img
删除镜像 ctr image rm 镜像REF
镜像打标签 ctr images tag 原镜像REF 新镜像REF(如 ctr images tag nginx:latest mynginx:v1

2. 容器管理(区分静态容器与动态任务)

  • 静态容器(container):仅初始化配置,未运行进程;动态任务(task):容器中运行的进程。

    操作 命令示例
    查看静态容器 ctr container ls / ctr c ls
    查看动态任务 ctr task ls / ctr t ls
    创建静态容器 ctr container create nginx:latest nginx1(镜像 REF + 容器 ID)
    启动动态任务(后台) ctr task start -d nginx1
    直接运行容器(一步到位) ctr run -d --net-host nginx:latest nginx2(–net-host 共享主机网络)
    进入容器 ctr task exec --exec-id (RANDOM 生成唯一 ID)
    暂停容器 ctr tasks pause nginx2
    恢复容器 ctr tasks resume nginx2
    停止任务 ctr tasks kill nginx2
    删除任务 ctr tasks delete nginx2
    删除静态容器 ctr container delete nginx2

3. 命名空间管理(隔离容器资源)

操作 命令示例
查看命名空间 ctr namespace ls / ctr ns ls
创建命名空间 ctr namespace create myns
删除命名空间 ctr namespace rm myns
在指定命名空间操作 ctr -n myns images pull 镜像REF(拉取镜像)、ctr -n myns container create 镜像REF 容器ID

4. 私有仓库 Harbor 对接

# 1. 配置 Harbor 域名解析(如 Harbor 地址 192.168.108.30)
echo "192.168.108.30 my.harbor.com" >> /etc/hosts

# 2. 拉取 Harbor 镜像(非 HTTPS 需加 --plain-http)
ctr image pull --plain-http 192.168.108.30/cloud/nginx:latest

# 3. 推送镜像到 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

五、nerdctl 实践(Docker 兼容 CLI)

1. 安装与配置

# 1. 下载并安装 nerdctl(v1.4.0 为例)
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/

# 2. 配置命令自动补全
yum install -y bash-completion
nerdctl completion bash > /etc/bash_completion.d/nerdctl
source /etc/bash_completion.d/nerdctl

# 3. 安装 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

# 4. 配置镜像加速(修改 containerd 配置)
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml  # 找到 [plugins."io.containerd.grpc.v1.cri".registry]
mkdir -p /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml
# 添加:server = "https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"
# [host."https://054b8ac70e8010d90f2ac00ef29e6580.mirror.swr.myhuaweicloud.com"]
# capabilities = ["pull", "resolve"]
systemctl restart containerd

2. 核心操作(与 Docker 命令高度兼容)

(1)镜像管理
nerdctl images  # 查看镜像(同 docker images)
nerdctl pull nginx  # 拉取镜像(同 docker pull)
nerdctl tag nginx nginx:v1  # 打标签(同 docker tag)
nerdctl save nginx -o nginx.tar  # 导出镜像(同 docker save)
nerdctl load -i nginx.tar  # 导入镜像(同 docker load)
nerdctl rmi nginx:v1  # 删除镜像(同 docker rmi)
nerdctl image prune --all --force  # 清理无用镜像
(2)容器管理
nerdctl run -d --name nginx1 -p 8080:80 nginx  # 运行容器(同 docker run)
nerdctl ps  # 查看运行容器(同 docker ps)
nerdctl ps -a  # 查看所有容器(同 docker ps -a)
nerdctl exec -it nginx1 bash  # 进入容器(同 docker exec)
nerdctl logs nginx1  # 查看日志(同 docker logs)
nerdctl stop nginx1  # 停止容器(同 docker stop)
nerdctl start nginx1  # 启动容器(同 docker start)
nerdctl rm nginx1  # 删除容器(同 docker rm)
nerdctl container prune --force  # 清理停止容器
nerdctl commit nginx1 nginx:custom  # 提交容器为镜像(同 docker commit)
(3)网络管理
nerdctl network ls  # 查看网络(同 docker network ls)
nerdctl network inspect bridge  # 查看网络详情
nerdctl run -d --net host busybox sleep infinity  # 使用主机网络
(4)存储管理
nerdctl volume ls  # 查看卷(同 docker volume ls)
nerdctl run -d -v /host/data:/container/data busybox sleep infinity  # 绑定挂载
nerdctl run -d -v myvol:/data busybox sleep infinity  # 使用命名卷
(5)命名空间管理
nerdctl namespace ls  # 查看命名空间
nerdctl namespace create testns  # 创建命名空间
nerdctl -n testns run -d nginx  # 在指定命名空间运行容器

六、crictl 实践(K8s CRI 专用工具)

1. 安装与配置

# 1. 配置 K8s YUM 源
vim /etc/yum.repos.d/kubernetes.repo
# 添加:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key

# 2. 安装 cri-tools(含 crictl)
yum install -y cri-tools

# 3. 配置对接 Containerd
vim /etc/crictl.yaml
# 添加:
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 5
debug: false

# 或通过命令配置
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

2. 核心操作(面向 K8s 调试)

(1)镜像操作
crictl images  # 查看镜像
crictl pull httpd  # 拉取镜像
crictl rmi 镜像ID  # 删除镜像
crictl inspecti 镜像ID  # 查看镜像详情
(2)容器操作
crictl ps  # 查看运行容器
crictl ps -a  # 查看所有容器
crictl exec -it 容器ID sh  # 进入容器
crictl logs 容器ID  # 查看容器日志
crictl stop 容器ID  # 停止容器
crictl rm 容器ID  # 删除容器
crictl stats  # 查看容器资源占用
(3)Pod 操作(K8s 特有)
crictl pods  # 查看 Pod
crictl runp pod配置.json  # 运行 Pod
crictl inspectp PodID  # 查看 Pod 详情
crictl stopp PodID  # 停止 Pod
crictl rmp PodID  # 删除 Pod

七、常用工具命令对照表

功能 Docker nerdctl ctr crictl
查看容器状态 docker ps nerdctl ps ctr task ls / ctr c ls crictl ps
查看镜像 docker images nerdctl images ctr i ls crictl images
查看容器日志 docker logs nerdctl logs crictl logs
查看容器详情 docker inspect nerdctl inspect ctr container info crictl inspect
运行容器 docker run nerdctl run ctr run
创建静态容器 docker create nerdctl create ctr container create crictl create
拉取镜像 docker pull nerdctl pull ctr image pull crictl pull
推送镜像 docker push nerdctl push ctr image push
删除容器 docker rm nerdctl rm ctr container rm crictl rm
删除镜像 docker rmi nerdctl rmi ctr image rm crictl rmi
进入容器执行命令 docker exec nerdctl exec ctr task exec crictl exec
镜像打标签 docker tag nerdctl tag ctr image tag
导入镜像 docker load nerdctl load ctr image import
导出镜像 docker save nerdctl save ctr image export

工具差异说明

  • nerdctl:Docker CLI 兼容,功能全面(支持网络、存储、命名空间),适合日常容器管理。
  • ctr:Containerd 内置调试工具,无兼容性封装,适合底层操作与问题排查。
  • crictl:K8s CRI 标准工具,专注 K8s 集群中容器运行时调试,支持 Pod 相关操作。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐