Containerd容器
在容器技术飞速发展的今天,Containerd作为云原生计算基金会(CNCF)的孵化项目,已成为Kubernetes默认的容器运行时。它最初由Docker团队开发,旨在提供标准化的容器生命周期管理能力。与Docker相比,Containerd更专注于容器运行时的核心功能,以轻量级、模块化和可扩展的特性,成为现代容器生态系统的基石。Containerd(Container Daemon)是一个开源容
目录
简介
在容器技术飞速发展的今天,Containerd作为云原生计算基金会(CNCF)的孵化项目,已成为Kubernetes默认的容器运行时。它最初由Docker团队开发,旨在提供标准化的容器生命周期管理能力。与Docker相比,Containerd更专注于容器运行时的核心功能,以轻量级、模块化和可扩展的特性,成为现代容器生态系统的基石。
一、Containerd概念与起源
1. 什么是Containerd?
Containerd(Container Daemon)是一个开源容器运行时,专注于容器生命周期管理、镜像操作和运行时环境构建。其核心特点包括:
- 生命周期管理:支持容器创建、运行、暂停、恢复、停止和销毁等全流程操作
- 标准化接口:遵循OCI(Open Container Initiative)规范,可与Kubernetes、Docker Compose等编排工具无缝集成
- 镜像管理:支持镜像拉取、推送、存储和分发,基于OCI镜像格式标准
- 插件体系结构:通过插件扩展功能,如存储驱动、网络插件、监控插件等
- 跨平台支持:兼容Linux、Windows等多平台环境
- 安全隔离:基于Linux命名空间和Cgroup实现容器隔离与资源控制
2. Containerd的起源与发展历程
Containerd的诞生与Docker的架构演进密切相关:
- Docker架构拆分:随着Docker功能膨胀,团队将其拆分为多个轻量级组件,Containerd作为核心运行时独立出来
- 捐赠给CNCF:2017年,Docker将Containerd代码捐赠给CNCF,推动容器技术标准化
- OCI规范兼容:Containerd遵循OCI标准,实现与其他容器工具的互操作性
- 独立运行时定位:不仅服务于Docker,还作为Kubernetes默认运行时,支持多编排系统集成
二、Containerd架构
Containerd采用客户端-服务器(C/S)架构,通过UNIX Domain Socket暴露gRPC API,核心组件可分为三大模块:
1. 存储(Storage)模块
- Content:存储容器镜像的实际数据,包括文件系统层和元数据
- Snapshot:管理容器文件系统快照,支持多容器共享文件系统层
- Diff:记录文件系统层之间的差异,以增量方式保存变更
2. 元数据(Metadata)模块
- Images:存储镜像元数据(标签、大小、创建时间等)
- Containers:管理容器生命周期的元数据配置
3. 运行时(Runtime)模块
- Tasks:管理容器内的进程组,与Shim协作维护容器状态
- Events:记录容器生命周期事件(创建、启动、停止等),用于监控和日志
架构特点
Containerd通过插件机制实现高度可扩展,常见插件类型包括:
- Shim插件:管理容器进程生命周期
- Snapshotter插件:处理文件系统快照(支持overlayfs、btrfs等)
- Runtime插件:支持不同运行时(runc、kata-containers等)
- Network插件:实现容器网络配置
三、Containerd环境部署
1. 安装Containerd(CentOS示例)
# 步骤1:添加Docker CE软件源(使用阿里云镜像加速)
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 修改软件源配置,适配CentOS 8+环境
sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
sed -i 's/$basearch/x86_64/g' /etc/yum.repos.d/docker-ce.repo
# 步骤2:列出可用的Containerd版本
yum list containerd.io --showduplicates
# 步骤3:安装Containerd(默认安装最新稳定版)
yum -y install containerd.io
解释:
- 通过curl获取Docker CE官方源并替换为阿里云镜像,加速下载
- sed命令修改repo文件中的版本变量,适配CentOS系统
- yum安装命令自动解决依赖,安装Containerd运行时
2. 生成与配置Containerd默认文件
# 生成默认配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 配置镜像加速(以Docker Hub和K8s镜像为例)
vim /etc/containerd/config.toml
# 在配置文件中找到[plugins."io.containerd.grpc.v1.cri".registry]部分,添加以下内容:
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" # 证书配置路径
# 创建镜像加速配置目录
mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /etc/containerd/certs.d/registry.k8s.io
# 配置Docker Hub镜像加速(使用DaoCloud镜像服务)
cat <<EOF | sudo tee /etc/containerd/certs.d/docker.io/hosts.toml
server = "docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
# 配置K8s镜像加速(使用阿里云镜像服务)
cat <<EOF | sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
# 重启Containerd服务
systemctl restart containerd
systemctl status containerd
# 验证安装版本
ctr version
解释:
-
containerd config default生成默认配置文件,包含存储、运行时等基础配置 - 镜像加速配置通过
hosts.toml文件指定镜像仓库的代理地址,capabilities指定支持的操作(拉取、解析) -
override_path = true用于覆盖镜像路径,将K8s官方镜像映射到阿里云镜像地址
四、Containerd核心操作
1. 镜像管理操作
# 全平台拉取Nginx镜像(包含所有架构版本)
ctr images pull docker.io/library/nginx:latest --all-platforms --hosts-dir=/etc/containerd/certs.d/
# 指定平台拉取(如Linux/AMD64)
ctr images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
# 查看本地镜像(默认在default命名空间)
ctr images ls
# 查看指定命名空间镜像(如K8s.io)
ctr -n k8s.io images ls
# 检测镜像完整性(STATUS为complete表示可用)
ctr images check
# 重新打标签(方便本地管理)
ctr images tag docker.io/library/nginx:latest nginx:v1
# 删除镜像
ctr images rm nginx:v1
# 镜像挂载到主机目录(用于查看镜像文件系统)
ctr images mount nginx:v1 /mnt
# 卸载镜像挂载
ctr images unmount /mnt
# 全平台导出镜像为tar包
ctr images export --all-platforms nginx_latest.tar docker.io/library/nginx:latest
# 指定平台导入镜像
ctr images import --platform linux/amd64 nginx_latest.tar
关键参数说明:
-
--all-platforms:拉取所有架构的镜像版本 -
--platform:指定目标架构(如linux/amd64) -
--hosts-dir:指定镜像仓库配置目录,使用已配置的加速地址 -
mount操作可用于查看镜像内部文件结构,便于调试
2. 容器与任务管理
# 创建容器(基于Nginx镜像,容器名为nginx)
ctr containers create nginx:v1 nginx
# 列出容器
ctr containers ls
# 查看容器详细信息
ctr containers info nginx
# 删除容器(需先停止任务)
ctr containers rm nginx
# 启动容器任务(-d表示后台运行)
ctr task start -d nginx
# 查看运行中的任务
ctr task ls
# 进入容器(需指定exec-id,可自定义)
ctr task exec --exec-id 0 -t nginx sh
# 暂停容器
ctr task pause nginx
# 恢复容器
ctr task resume nginx
# 杀死容器任务
ctr task kill nginx
# 删除任务
ctr task rm nginx
# 获取容器资源使用 metrics
ctr task metrics nginx
# 查看容器内进程在宿主机的PID
ctr task ps nginx
注意事项:
- Containerd中
container与task是分离概念:container是配置实体,task是运行中的进程组 - 端口映射需通过上层编排工具(如Kubernetes)实现,Containerd本身不支持
-
metrics命令可获取容器内存、CPU、进程数等资源使用情况
3. 插件与命名空间管理
# 列出所有插件及状态
ctr plugins ls
# 创建命名空间(用于资源隔离)
ctr ns create test
# 查看命名空间列表
ctr ns ls
# 删除命名空间
ctr ns rm test
# 在指定命名空间操作(如拉取镜像)
ctr -n test images pull docker.io/library/nginx:latest --platform linux/amd64 --hosts-dir=/etc/containerd/certs.d/
命名空间作用:
- 实现资源隔离,不同命名空间的容器互不可见
- 常用于多租户环境或不同业务线的资源隔离
五、Containerd与Kubernetes的集成
作为Kubernetes默认运行时,Containerd通过CRI(Container Runtime Interface)接口与Kubernetes集成。在Kubernetes集群中,只需在节点配置中指定使用Containerd作为运行时,即可无缝对接。
# kubelet配置示例(/etc/kubernetes/kubelet.conf)
apiVersion: kubelet.config.k8s.io/v1
kind: KubeletConfiguration
containerRuntime: containerd
containerRuntimeEndpoint: unix:///run/containerd/containerd.sock
通过这种集成,Kubernetes可直接利用Containerd的镜像管理、容器生命周期管理等能力,实现大规模容器集群的调度与管理。
总结
Containerd以其轻量级、标准化和可扩展的特性,成为云原生容器技术的核心基础设施。从Docker架构拆分到CNCF孵化项目,它的发展始终围绕"标准化容器运行时"的目标,为Kubernetes等编排系统提供了稳定可靠的底层支持。
掌握Containerd的核心概念、架构设计、部署方法及日常操作,为深入理解云原生容器技术栈奠定基础。在微服务和容器化普及的今天,熟练运用Containerd将成为云原生工程师的必备技能。
更多推荐


所有评论(0)