| 备注 | 修改日期 | 修改人 |
| 创建版本 | 2025-12-27 13:30:19[当前版本] | 文艺范儿 |
Containerd 是一个工业级标准的容器运行时,最初作为 Docker 的一部分开发,后来独立出来成为 CNCF 毕业项目。它负责管理容器的生命周期,包括镜像传输、存储、执行等。
应用程序
↓
Docker/CRI Runtime (containerd-shim)
↓
Containerd Core
├── Content (镜像内容)
├── Snapshot (快照管理)
├── Images (镜像管理)
├── Containers (容器管理)
└── Tasks (任务执行)
↓
Linux Kernel (runc)
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
ctr是 containerd 自带的命令行工具,但功能相对基础。
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
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
# 查看版本 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 → 主机目录数据持久化到容器
# 拉取镜像(类似 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
# 查看配置 containerd config dump # 重新加载配置 systemctl reload containerd # 查看运行时状态 ctr system info
# 查看 containerd 日志 journalctl -u containerd -f # 查看运行时指标 ctr metrics # 检查运行时状态 ctr runtime list
# 使用 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
# 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
# 创建数据卷 nerdctl volume create app-data # 使用数据卷运行数据库 nerdctl run -d \ --name redis-db \ -v app-data:/data \ redis:alpine redis-server --appendonly yes
# 创建自定义网络 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
| 功能 | 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 |
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. 维护容器元数据(存储在 |
Containerd-shim |
1. 作为容器进程的父进程(避免 containerd 退出影响容器); 2. 转发容器 I/O 到 Dockerd; 3. 支持 containerd 的热升级(无需重启容器)。 |
# 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
# 修改配置 /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