基本概念
一、架构设计
Containerd 采用分层模块化架构,核心分为三层:
-
API 层
- 提供 gRPC 接口,支持 CRI(Container Runtime Interface)规范,兼容 Kubernetes 及自定义客户端(如 Docker CLI)。
- 对外暴露容器生命周期管理、镜像操作等接口,同时集成 Prometheus 监控指标。
-
Core 层
- Bundle 子系统:管理容器配置(OCI Bundle),包括镜像解压、快照创建(基于 OverlayFS/ZFS 等)。
- Runtime 子系统:通过
containerd-shim
调用底层运行时(如 runc),实现容器进程隔离与生命周期控制。 - 元数据存储:使用 BoltDB 存储镜像、容器等持久化数据。
-
Backend 层
- 插件体系:支持可扩展的存储驱动、网络插件及运行时(如 Kata Containers、gVisor)。
- 事件与度量:全局事件总线(Events)和性能指标收集(Metrics)。
- 快照管理:通过 Snapshotter 实现镜像分层存储与高效容器启动。
数据流示例:拉取镜像 → 存储至 Content Store → 解压层为快照 → 生成 OCI Bundle →
containerd-shim
调用 runc 创建容器。
二、核心原理
-
容器生命周期管理
- 容器启动:通过
containerd-shim
启动 runc,创建隔离的命名空间(PID/Network/Mount 等)。 - 进程托管:shim 作为容器的父进程,确保容器退出后资源回收,实现 daemon 无状态化。
- 容器启动:通过
-
镜像分发与存储
- 遵循 OCI 标准,支持从仓库拉取镜像并存储为多层快照(每个层对应独立 hash)。
- 快照复用:相同镜像层仅存储一次,新容器通过 OverlayFS 挂载写时复制(CoW)层。
-
安全隔离
- 默认启用 Linux Capabilities 限制与非特权模式,支持 Seccomp/AppArmor 策略。
- 多租户隔离:通过命名空间(Namespace)分隔不同用户或集群的容器资源。
三、关键特性
特性 | 说明 |
---|---|
轻量化高性能 | 内存占用比 Docker 低 40%,容器启动延迟降至毫秒级。 |
标准化兼容 | 遵循 OCI 规范,无缝集成 Kubernetes(通过 CRI)、Docker 等生态。 |
插件化扩展 | 支持自定义存储驱动(ZFS)、网络插件(Cilium)、安全运行时(Kata)。 |
生产级可靠性 | 支持热升级、故障恢复、多副本元数据存储。 |
高效存储 | Erofs 快照器优化只读层性能,分块拉取镜像减少网络开销。 |
四、技术意义
-
云原生基石
- 作为 Kubernetes 默认运行时(占比超 85%),提供稳定高效的容器调度基础。
- 解耦编排系统与底层运行时,推动生态系统标准化。
-
模块化演进
- 脱离 Docker 单体架构,专注核心功能(镜像/容器/存储管理),成为“容器运行时的事实标准”。
-
生态协同优化
- 通过 CRI 接口对接 Kubelet,减少组件冗余调用,提升集群性能。
- 支持沙箱容器(如 runsc),扩展安全隔离场景。
总结:Containerd 通过轻量架构、开放标准及插件化设计,成为云原生时代容器管理的核心引擎,平衡了性能、灵活性与生产稳定性。
基本部署
1. 环境准备
# 安装基础依赖(适用于 CentOS/RHEL)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 解析:安装必要的存储驱动工具(如 device-mapper)和包管理工具(yum-utils)。
# 添加阿里云镜像源(国内加速)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
- 解析:替换默认仓库为阿里云镜像源,加速下载速度。
2. 安装 Containerd
# 安装 containerd 和 runc(二进制全量包)
wget https://github.com/containerd/containerd/releases/download/v1.7.14/cri-containerd-cni-1.7.14-linux-amd64.tar.gz
tar zxf cri-containerd-cni-1.7.14-linux-amd64.tar.gz -C /
- 解析:下载官方发布的
cri-containerd-cni
包(包含 containerd、runc 和 CNI 插件),解压至根目录。
# 生成默认配置文件
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
- 解析:创建配置目录并生成默认 TOML 格式配置文件,定义存储路径、运行时等参数。
3. 配置优化
# 编辑配置文件(关键参数)
sudo nano /etc/containerd/config.toml
- 修改项:
- 镜像加速:在
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
下添加阿里云镜像加速地址。 - 存储驱动:设置
SystemdCgroup = true
以兼容 Kubernetes。 - 日志级别:调整
level = "info"
便于调试。
- 镜像加速:在
4. 启动服务
# 通过 systemd 管理服务
systemctl --now enable containerd
- 解析:启用并立即启动 containerd 守护进程。
# 验证安装
ctr version
- 预期输出:
Client: Version: v1.7.14 Server: Version: v1.7.14
- 解析:确认客户端和服务端版本一致。
5. 工具链补充
# 安装 nerdctl(兼容 Docker CLI 的工具)
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-1.5.0-linux-amd64.tar.gz
tar zxf nerdctl-1.5.0-linux-amd64.tar.gz -C /usr/local/bin
- 解析:nerdctl 提供类似
docker
的命令行体验,支持镜像和容器管理。
6. 集成 Kubernetes(可选)
# 修改 kubelet 配置
echo 'KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"' > /etc/sysconfig/kubelet
- 解析:配置 kubelet 使用 containerd 作为 CRI 运行时。
关键点总结
- 模块化安装:选择
cri-containerd-cni
全量包避免手动组装组件。 - 配置优先级:镜像加速和存储驱动是生产环境必调参数。
- 生态兼容:通过 nerdctl 或直接调用
ctr
管理容器。 - K8s 集成:需显式指定 containerd 的 CRI 接口路径。
注:若需完整卸载,执行
rm -rf /etc/containerd
并清理 systemd 单元文件。
命令行工具
一、ctr(Containerd 原生 CLI)
1. 镜像管理
ctr image pull docker.io/library/nginx:latest
- 解析:从 Docker Hub 拉取 Nginx 镜像,默认存储至
default
命名空间。 - 关键参数:
--snapshotter
可指定快照驱动(如overlayfs
)。
ctr image ls
- 解析:列出本地镜像,显示仓库名、标签及大小,格式与
docker images
类似但更精简24。
ctr image rm docker.io/library/nginx:latest
- 解析:删除指定镜像,若镜像被容器引用则需先删除容器。
2. 容器管理
ctr container create docker.io/library/nginx:latest my-nginx
- 解析:创建容器但不启动,生成 OCI 规范配置至
/var/lib/containerd
。 - 命名空间:通过
-n k8s.io
可操作 Kubernetes 创建的容器。
ctr task start my-nginx
- 解析:启动容器任务,底层调用
runc
创建隔离进程26。
ctr task exec --exec-id sh my-nginx /bin/sh
- 解析:进入运行中的容器执行命令,
--exec-id
需唯一标识会话。
二、crictl(Kubernetes CRI 工具)
1. 配置
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
- 解析:配置 CRI 接口路径,使
crictl
可管理 Containerd 运行时。
2. 容器操作
crictl ps -a
- 解析:列出所有容器(包括停止的),输出格式兼容
docker ps
。 - 限制:仅显示
k8s.io
命名空间的容器。
crictl logs <container-id>
- 解析:查看容器日志,自动聚合 stdout/stderr 流。
三、nerdctl(Docker 风格 CLI)
1. 容器生命周期
nerdctl run -d --name web nginx:latest
- 解析:后台运行容器,支持
-p
端口映射等 Docker 兼容参数。 - 依赖:需提前安装 CNI 插件以支持网络功能。
nerdctl compose up -d
- 解析:通过 Compose 文件启动多容器应用,语法与 Docker Compose 一致。
2. 镜像构建
nerdctl build -t my-app .
- 解析:使用当前目录的 Dockerfile 构建镜像,支持缓存和多阶段构建。
四、工具对比与适用场景
工具 | 定位 | 优势 | 局限性 |
---|---|---|---|
ctr | Containerd 原生调试工具 | 直接操作底层 API,适合开发调试 | 命令冗长,功能较基础 |
crictl | Kubernetes 运维工具 | 专为 K8s 设计,支持 Pod 级操作 | 仅限 k8s.io 命名空间 |
nerdctl | 开发者友好型工具 | 完全兼容 Docker CLI 习惯 | 需额外安装 CNI/构建组件 |
五、底层原理补充
- 命名空间隔离
ctr -n k8s.io
与crictl
操作同一批容器,但普通ctr
命令默认使用default
命名空间。
- CRI 接口调用
crictl
通过 CRI 插件与 Containerd 交互,而ctr
直接调用 gRPC 接口。
- 日志存储
- 容器日志默认存储在
/var/log/pods/<namespace>_<pod>_<id>/
下,由 kubelet 管理。
- 容器日志默认存储在
提示:生产环境推荐组合使用
nerdctl
(开发) +crictl
(运维)。
ctr命令解析
一、基础命令结构
ctr [全局选项] <子命令> [子命令选项] [参数]
- 全局选项:
--address
:指定 containerd 的 gRPC 套接字路径(默认/run/containerd/containerd.sock
)。
--namespace
:设置命名空间(默认default
,Kubernetes 容器需用k8s.io
)。
--debug
:启用调试日志输出。
二、镜像管理
1. 拉取镜像
ctr image pull docker.io/library/nginx:latest
- 解析:从 Docker Hub 拉取镜像,需完整指定仓库路径(
docker.io/library/
不可省略)。 - 存储位置:镜像内容保存至
/var/lib/containerd/io.containerd.content.v1.content
。
2. 本地镜像操作
ctr image list
- 输出示例:
REF TYPE DIGEST docker.io/library/nginx:latest application/vnd.docker.distribution.manifest.v2+json sha256:...
- 解析:列出镜像的引用、类型及摘要,无友好名称显示(对比
docker images
)。
ctr image mount docker.io/library/nginx:latest /mnt/nginx
- 解析:将镜像挂载到主机目录,可直接访问其文件系统(需手动卸载
ctr image unmount /mnt/nginx
)。
三、容器生命周期
1. 创建容器
ctr container create docker.io/library/nginx:latest my-nginx
- 解析:创建容器但不启动,生成 OCI 配置至
/var/lib/containerd/io.containerd.runtime.v2.task/default/my-nginx
。 - 关键差异:无自动端口映射或后台运行选项,需手动配置。
2. 启动任务
ctr task start my-nginx
- 解析:启动容器进程,底层调用
runc
创建命名空间隔离的进程。 - 日志查看:需通过
ctr task logs my-nginx
或直接访问日志文件。
3. 交互式操作
ctr task exec --exec-id sh my-nginx /bin/sh
- 解析:进入容器执行命令,
--exec-id
需唯一标识会话(如随机生成 UUID)。
四、高级功能
1. 命名空间管理
ctr namespace create dev ctr -n dev image pull docker.io/alpine:latest
- 解析:隔离不同环境的资源(如开发/生产),Kubernetes 专用
k8s.io
命名空间。
2. 快照管理
ctr snapshot ls
- 解析:列出所有快照(镜像层),显示挂载点和父层关系,基于 OverlayFS 实现写时复制。
五、与 Docker 的差异对比
功能 | ctr 实现 | Docker 等效命令 | 说明 |
---|---|---|---|
镜像拉取 | ctr image pull | docker pull | ctr 需完整仓库路径 |
容器运行 | ctr run (直接启动) | docker run -d | ctr 无自动后台运行选项 |
日志查看 | ctr task logs | docker logs | ctr 日志输出为原始流 |
网络配置 | 依赖 CNI 插件手动配置 | Docker 原生网络驱动 | ctr 不集成网络功能 |
六、调试技巧
-
事件监控
ctr events
- 解析:实时显示容器生命周期事件(创建/启动/停止)。
-
资源限制检查
ctr task metrics my-nginx
- 输出:显示容器 CPU/内存/PID 使用量,需提前配置 cgroups。
注意:
ctr
作为调试工具,命令及输出格式可能随版本变化,生产环境建议使用nerdctl
或crictl
。