智能
助手
最大化  清空记录 停止  历史记录
翻译选中文本
选中一段文本后进行翻译
名词解释
选中一段文本后进行名词解释
知识图谱生成
通过图谱展示知识信息
登录用户在知识浏览页面可用
答案生成
AI自动回答一个问答功能中的问题
登录用户在问答浏览页面,且问题开放回答中可用
知识摘要
自动为当前知识生成摘要
知识浏览页面可用
知识问答
针对当前知识进行智能问答
知识浏览面可用
2025-12-27 13:30:19 版本 : 12. Containerd
作者: 文艺范儿 于 2025年12月27日 发布在分类 / Docker & K8S / docker进阶 下,并于 2025年12月27日 编辑
 历史版本

备注 修改日期 修改人
创建版本 2025-12-27 13:30:19[当前版本] 文艺范儿

12. Containerd

12.1 Containerd 简介

12.1.1 什么是 Containerd?

Containerd 是一个工业级标准的容器运行时,最初作为 Docker 的一部分开发,后来独立出来成为 CNCF 毕业项目。它负责管理容器的生命周期,包括镜像传输、存储、执行等。

12.1.2 核心特性

  • 符合 OCI 标准:完全兼容 Open Container Initiative 规范
  • 轻量级设计:专注于核心容器运行时功能
  • 高性能:直接管理容器生命周期,性能优异
  • 安全可靠:支持命名空间隔离、SELinux、AppArmor 等安全特性
  • 插件化架构:支持多种存储、网络插件扩展

12.1.3 架构层次

应用程序
    ↓
Docker/CRI Runtime (containerd-shim)
    ↓
Containerd Core
    ├── Content (镜像内容)
    ├── Snapshot (快照管理)
    ├── Images (镜像管理)
    ├── Containers (容器管理)
    └── Tasks (任务执行)
    ↓
Linux Kernel (runc)

12.2 Containerd 安装

Ubuntu/Debian 安装

使用官方仓库安装(推荐

# 1. 下载并安装
wget https://github.com/containerd/containerd/releases/download/v2.2.1/containerd-2.2.1-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-2.2.1-linux-amd64.tar.gz

# 2. 编辑systemd 服务文件
[root@docker-71 ~]# vim containerd.service
[root@docker-71 ~]# cat containerd.service
# Copyright The containerd Authors.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target dbus.service

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target


[root@docker-71 ~]# mkdir -p /usr/lib/systemd/system
[root@docker-71 ~]# mv containerd.service /usr/lib/systemd/system/

# 3. 创建配置目录
mkdir -p /etc/containerd

# 4. 生成默认配置
containerd config default | tee /etc/containerd/config.toml

# 5. 修改配置(可选:使用 systemd cgroup driver)

sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

# 6. 启动服务
systemctl daemon-reload
systemctl enable containerd
systemctl start containerd

# 7. 验证安装
systemctl status containerd
containerd --version

12.3 Containerd 客户端工具

12.3.1 安装 ctr(内置客户端)

ctr是 containerd 自带的命令行工具,但功能相对基础。

12.3.2 安装 nerdctl

nerdctl 是 Docker CLI 风格的 containerd 客户端,功能更丰富:

# 下载 nerdctl
wget https://github.com/containerd/nerdctl/releases/download/v2.2.1/nerdctl-2.2.1-linux-amd64.tar.gz
tar Cxzvf /usr/local/bin nerdctl-2.2.1-linux-amd64.tar.gz

# 验证安装
nerdctl version
12.3.3 安装runc

runc是一个轻量级的容器运行时工具,用于根据 OCI(开放容器倡议,Open Container Initiative)标准创建和运行容器。它是 Docker、Kubernetes 等容器生态系统中底层核心组件之一,负责将容器镜像转换为可运行的进程,并管理容器的生命周期(如创建、启动、停止、删除)。

# 下载 runc
wget https://github.com/opencontainers/runc/releases/download/v1.4.0/runc.amd64
mv runc.amd64 /usr/local/bin/runc
chmod +x /usr/local/bin/runc

# 验证安装
runc -v

12.4 Containerd 常用命令

12.4.1 使用 ctr 命令

基础信息
# 查看版本
containerd --version

# 查看服务状态
systemctl status containerd

# 查看 containerd 进程
ps aux | grep containerd
镜像管理
# 由于docker官方镜像在国内拉不下来,换取docker.m.daocloud.io代理拉取
# 拉取镜像(需要完整镜像名)
#ctr images pull docker.io/library/nginx:alpine
#ctr images pull docker.io/library/redis:latest
ctr images pull docker.m.daocloud.io/library/nginx:alpine
ctr images pull docker.m.daocloud.io/library/redis:latest


# 列出镜像
ctr images list
ctr images ls

# 查看镜像
ctr images inspect docker.m.daocloud.io/library/nginx:alpine

# 删除镜像
ctr images rm docker.m.daocloud.io/library/nginx:alpine

# 导出镜像
ctr images export nginx.tar docker.m.daocloud.io/library/nginx:alpine

# 导入镜像
ctr images import nginx.tar

# 打标签
ctr images tag nginx:alpine myregistry.com/nginx:v1.0
ctr images tag nginx:alpine nginx:alpine

# 检查现有就镜像以确保所有内容在本地可用
ctr images check
容器管理
# 运行容器
ctr run --rm -t nginx:alpine nginx-test

# 创建容器(不运行)
ctr containers create nginx:alpine nginx-container

# 列出容器
ctr containers list
ctr containers ls

# 查看容器详情
ctr containers info nginx-container

# 启动容器,加-d后台运行 
ctr tasks start -d nginx-container

# 查看运行的任务(容器进程)
ctr tasks list
ctr tasks ls

# 暂停容器
ctr tasks pause nginx-container

# 恢复容器
ctr tasks resume nginx-container

# 进入容器(exec)
ctr tasks exec --exec-id 1 -t nginx-container sh

# 停止任务
ctr tasks kill nginx-container
ctr tasks delete nginx-container

# 删除容器,可以用-f强制删除
ctr containers delete nginx-container
ctr containers rm nginx-container
命名空间管理
# 列出命名空间
ctr namespaces list

# 创建命名空间
ctr namespaces create k8s

# 在特定命名空间中操作
ctr -n k8s images pull docker.m.daocloud.io/library/nginx:alpine
ctr -n k8s containers list  #如要启动容器后才能看到

# 删除命名空间,先要删除命名空间里的镜像
ctr -n k8s images rm  docker.m.daocloud.io/library/nginx:alpine
ctr namespaces rm k8s
数据持久化
# 1. 创建主机目录(作为持久化存储)
mkdir -p /data/nginx-html

# 2. 创建容器并挂载主机目录到容器的 /usr/share/nginx/html
ctr container create \
  --snapshotter overlayfs \
  --mount type=bind,src=/data/nginx-html,dst=/usr/share/nginx/html,options=rbind:rw \
  docker.m.daocloud.io/library/nginx:alpine \
  my-nginx-volume

# 3. 启动容器
ctr task start -d my-nginx-volume

# 4. 验证挂载:主机目录写入文件,容器内可见
echo "from host volume" > /data/nginx-html/host-test.txt
ctr task exec -t --exec-id 3 my-nginx-volume cat /usr/share/nginx/html/host-test.txt
# 输出:from host volume → 主机目录数据持久化到容器

12.4.2 使用 nerdctl 命令(推荐)

镜像管理
# 拉取镜像(类似 docker)
nerdctl pull docker.m.daocloud.io/library/nginx:alpine
nerdctl pull docker.m.daocloud.io/library/redis:latest

# 列出镜像
nerdctl images

# 查看镜像详情
nerdctl image inspect docker.m.daocloud.io/library/nginx:alpine

# 删除镜像,可以加-f强制删除
nerdctl rmi docker.m.daocloud.io/library/nginx:alpine

# 构建镜像
nerdctl build -t myapp:latest .

# 登录镜像仓库
nerdctl login registry.example.com

# 推送镜像
nerdctl push myregistry.com/nginx:v1.0
容器管理
# 运行容器
nerdctl run -d --name nginx-test -p 8080:80 nginx:alpine

# 列出容器
nerdctl ps
nerdctl ps -a  # 包括停止的容器

# 查看容器日志
nerdctl logs nginx-test
nerdctl logs -f nginx-test  # 实时日志

# 进入容器
nerdctl exec -it nginx-test sh

# 启动/停止/重启容器
nerdctl start nginx-test
nerdctl stop nginx-test
nerdctl restart nginx-test

# 删除容器
nerdctl rm nginx-test
nerdctl rm -f nginx-test  # 强制删除运行中的容器

# 查看容器详情
nerdctl inspect nginx-test

# 查看容器资源使用
nerdctl stats nginx-test
网络和卷管理
# 网络管理
nerdctl network ls
nerdctl network create my-network
nerdctl run --network my-network -d nginx:alpine

# 卷管理
nerdctl volume ls
nerdctl volume create my-volume
nerdctl run -v my-volume:/data nginx:alpine

12.4.3 系统级管理命令

配置管理
# 查看配置
containerd config dump

# 重新加载配置
systemctl reload containerd

# 查看运行时状态
ctr system info
监控和调试
# 查看 containerd 日志
journalctl -u containerd -f

# 查看运行时指标
ctr metrics

# 检查运行时状态
ctr runtime list

12.5. 实用示例

12.5.1 运行 Web 服务

# 使用 nerdctl 运行 nginx
nerdctl run -d \
  --name web-server \
  --restart always \
  -p 80:80 \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  nginx:alpine

# 测试访问
curl http://localhost:80

12.5.2 构建和运行自定义镜像

# Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
EXPOSE 80

构建并运行:

# 构建镜像
nerdctl build -t my-web:latest .

# 运行容器
nerdctl run -d --name my-web -p 8080:80 my-web:latest

12.5.3 数据持久化

# 创建数据卷
nerdctl volume create app-data

# 使用数据卷运行数据库
nerdctl run -d \
  --name redis-db \
  -v app-data:/data \
  redis:alpine redis-server --appendonly yes

12.5.4 多容器应用

# 创建自定义网络
nerdctl network create app-network

# 运行数据库
nerdctl run -d \
  --name mysql \
  --network app-network \
  -e MYSQL_ROOT_PASSWORD=password \
  mysql:8.0

# 运行应用
nerdctl run -d \
  --name web-app \
  --network app-network \
  -p 3000:3000 \
  my-app:latest

12.6 与 Docker 对比

功能 Docker Containerd

镜像管理

docker pull

nerdctl pull / ctr images pull

容器运行

docker run

nerdctl run / ctr run

容器列表

docker ps

nerdctl ps / ctr containers list

镜像列表

docker images

nerdctl images / ctr images list

日志查看

docker logs

nerdctl logs / ctr tasks logs

进入容器

docker exec

nerdctl exec / ctr tasks exec

构建镜像

docker build

nerdctl build

12.7 Docker与Containerd

Docker 从 1.11 版本开始就深度集成了 Containerd(2017 年 Docker 将 Containerd 捐赠给 CNCF 前,已是 Docker 内部的核心组件)。如今 Docker 的容器管理体系中,Containerd 扮演“底层容器运行时管理器”的角色,Docker 自身则作为上层 orchestration 工具(负责镜像构建、API 暴露、生态兼容等)。

Docker 与 Containerd 的集成架构

用户/Docker Client (docker CLI)
       ↓
Docker Daemon (dockerd) —— 负责镜像管理、API 处理、网络/存储插件
       ↓
Containerd (容器运行时管理器) —— 负责镜像分发、容器生命周期管理
       ↓
Containerd-shim (垫片进程) —— 隔离 containerd 与容器进程,支持热升级
       ↓
Runc (OCI 运行时) —— 真正创建/运行容器的底层引擎(遵循 OCI 标准)
       ↓
Linux Kernel (Namespace/Cgroup/OverlayFS 等)

集成的核心分工

组件 职责

Dockerd

1. 提供 REST API(/var/run/docker.sock)和 CLI(docker命令); 2. 镜像构建(docker build,基于 BuildKit); 3. 镜像存储管理(拉取/推送镜像到 Registry); 4. 网络(Docker Network)、存储卷(Docker Volume)管理; 5. 对接 Containerd 的 gRPC API。

Containerd

1. 接收 Dockerd 的请求,管理镜像的生命周期(pull/push/import/export); 2. 管理容器的生命周期(create/start/stop/rm); 3. 调用 RunC 执行容器(通过 Containerd-shim 隔离); 4. 维护容器元数据(存储在 /var/lib/containerd/metadata.db)。

Containerd-shim

1. 作为容器进程的父进程(避免 containerd 退出影响容器); 2. 转发容器 I/O 到 Dockerd; 3. 支持 containerd 的热升级(无需重启容器)。

12.8 故障排查

12.7.1 常见问题

# 1. 权限问题
usermod -aG docker $USER  # 如果使用 Docker 组
# 或者直接使用 sudo

# 2. cgroup 驱动问题
# 确保 /etc/containerd/config.toml 中 SystemdCgroup = true

# 3. 网络问题
# 检查 CNI 插件是否正确安装
ls /opt/cni/bin/

# 4. 查看详细日志
journalctl -u containerd -f --no-pager

12.7.2 性能调优

# 修改配置 /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true
  NoPivotRoot = false
  NoNewKeyring = false

# 调整并发数
[plugins."io.containerd.internal.v1.opt"]
  max_concurrent_downloads = 3
  max_concurrent_uploads = 5
历史版本-目录  [回到顶端]
    文艺知识分享平台 -V 5.2.5 -wcp