彻底掌握 Containerd:生产环境安装部署全解析

一、containerd简介

早期Containerd是在Docker Engine中,目前将containerd从Docker中拆分出来,作为一个独立的开源项目,目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的containerd将具有更多的功能,覆盖整个容器运行时的所有需求,提供更强大的支持。​​​​​​

Containerd是一个工业级标准的容器运行时,它强调简单性、可移植性``

管理容器的生命周期 (从create到delete)``

拉取/推送镜像容器``

存储管理``

调用runc运行容器``

管理容器网络接口

在企业级生产环境中,Containerd 通常不会作为独立的容器运行时单独使用,而是作为 Kubernetes 等容器编排平台的底层运行时,通过 CRI(Container Runtime Interface)接口与其集成。

若需在单机环境运行容器(如开发、测试或小型生产场景),Docker 仍是更推荐的选择,原因包括:

长期生产环境验证:经过多年大规模生产环境的打磨,稳定性有保障。

完善的工具链生态:CLI、日志、存储、网络等周边工具成熟。

更友好的开发者体验:Docker Compose、BuildKit 等工具链完整。

更低的运维成本:调试、监控、排错等运维体系成熟。

二、containerd部署

containerd 是一个高度模块化的容器运行时,专为性能和简洁性而设计。安装 containerd 需要手动下载和安装多个组件,包括 containerd 本身、Runc 和 CNI 插件。

Github上提供containerd两种安装包,分别是containerd与cni-containerd的安装包。其中,cni-containerd是包含contianerd本身还提供了Runc和CNI插件属于全量包

1.环境准备

1.1 本次环境
bash 复制代码
[root@node-3 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) 
[root@node-3 ~]# uname -r
3.10.0-862.el7.x86_64
[root@node-3 ~]# rpm -qa | grep libseccomp
libseccomp-2.3.1-4.el7.x86_64
1.2 解决containerd不兼容问题

containerd需要libseccomp的特定版本以确保兼容性和功能完整性。例如,在 CentOS 7 上,默认的libseccomp版本是2.3,这可能不满足最新版containerd的需求。因此,需要升级到2.4或更高版本的libseccomp,例如2.5.1版本‌。

解决方案:

需要安装依赖(CentOS 安装 libseccomp-devel;Ubuntu 安装 libseccomp-dev)。

下载包含 libseccomp 依赖的 runc 二进制文件。

方案实施:以下两种当时任选其一即可

bash 复制代码
#方式一 1.主机安装依赖libseccomp
#卸载旧libseccomp
rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps

#下载新版本wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm

#安装
rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm

#检查版本
rpm -qa | grep libseccomp

#方式二 2. 下载包含 libseccomp 依赖的 runc 二进制文件
wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64

#安装
cp runc.amd64 /usr/bin/runc
chmod +x /usr/bin/runc
1.3 加载内核模块
bash 复制代码
[root@node-3 ~]# cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

#手工加载,临时生效
[root@node-3 ~]# modprobe overlay
[root@node-3 ~]# modprobe br_netfilter
1.4 添加sysctl 系统内核参数
bash 复制代码
[root@node-3 ~]# cat <<EOF | sudo tee /etc/sysctl.d/containerd.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

#应用生效
[root@node-3 ~]# sysctl -p /etc/sysctl.d/containerd.conf

2.安装部署

bash 复制代码
#下载安装包
wget https://github.com/containerd/containerd/releases/download/v1.6.4/cri-containerd-cni-1.6.4-linux-amd64.tar.gz
wget https://d.frps.cn/file/kubernetes/containerd/cri-containerd-cni-1.6.4-linux-amd64.tar.gz

#解压安装包 直接给对应目录替换调
[root@node-3 ~]#  tar zxvf cri-containerd-cni-1.6.4-linux-amd64.tar.gz -C /

3.修改containerd配置文件

bash 复制代码
# 生成默认配置文件
[root@demo ~]# mkdir -p /etc/containerd
[root@demo ~]# containerd config default | sudo tee /etc/containerd/config.toml

#修改配置文件
#修改数据存储目录
[root@node-3 etc]# sed -ri 's@^(root).*@\1 = "/data/containerd"@g' /etc/containerd/config.toml
[root@node-3 etc]# grep '/data/containerd' /etc/containerd/config.toml
root = "/data/containerd"

#修改containerd沙盒镜像
[root@node-3 etc]# grep sandbox_image /etc/containerd/config.toml
    sandbox_image = "registry.k8s.io/pause:3.6"
[root@node-3 etc]# sudo sed -ri 's@(sandbox_image).*@\1 = "registry.aliyuncs.com/google_containers/pause:3.9"@g' /etc/containerd/config.toml
[root@node-3 etc]# grep sandbox_image /etc/containerd/config.toml
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

#containerd开启cgroup功能
#当主机使用 systemd 作为 init 系统时,启用这个选项可以使容器资源管理(CPU/内存等)与 systemd 更好地集成
[root@node-3 etc]# sed -ri 's@(SystemdCgroup).*@\1 = true@g' /etc/containerd/config.toml
[root@node-3 etc]# grep SystemdCgroup /etc/containerd/config.toml
            SystemdCgroup = true

#containerd设置registry配置目录
#指定 containerd 查找容器镜像仓库证书(TLS 配置)的目录,如配置私有镜像仓库(如 Harbor、Nexus)的 TLS 证书时
[root@node-3 opt]# sed -ri 's@(config_path).*@\1 = "/etc/containerd/certs.d"@g' /etc/containerd/config.toml
[root@node-3 opt]# grep config_path /etc/containerd/config.toml
      config_path = "/etc/containerd/certs.d"

#

4.配置systemd服务

默认cri-containerd-cni包中会有containerd启动脚本,我们已经解压到对应的目录,可以直接调用启动

bash 复制代码
[root@web01 ~]# systemctl enable containerd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/containerd.service to /etc/systemd/system/containerd.service.
 #查看containerd启动状态
[root@web01 ~]# systemctl status containerd

5.配置镜像加速器

从 containerd 1.5+ 版本开始,官方推荐使用 certs.d 目录结构来管理镜像加速器(替代传统的 config.toml 配置)。

每个镜像仓库(如 docker.io)的配置位于独立文件 /etc/containerd/certs.d/<仓库域名>/hosts.toml。

​​​​​​​server:指定默认的 Docker Hub 官方地址 (docker.io)。

[host."..."]:每个镜像加速器的地址。

capabilities:允许 pull(拉取)和 resolve(解析)。

containerd 会按顺序尝试这些镜像源,直到成功拉取。

bash 复制代码
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://docker.io"

[host."https://k0jntw7k.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve"]

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]

[host."https://dockerpull.com"]
  capabilities = ["pull", "resolve"]

[host."https://docker.registry.cyou"]
  capabilities = ["pull", "resolve"]

[host."https://atomhub.openatom.cn"]
  capabilities = ["pull", "resolve"]

[host."https://docker.1panel.live"]
  capabilities = ["pull", "resolve"]

[host."https://hub.rat.dev"]
  capabilities = ["pull", "resolve"]

[host."https://docker.awsl9527.cn"]
  capabilities = ["pull", "resolve"]

[host."https://do.nark.eu.org"]
  capabilities = ["pull", "resolve"]

[host."https://docker.ckyl.me"]
  capabilities = ["pull", "resolve"]

[host."https://hub.uuuadc.top"]
  capabilities = ["pull", "resolve"]

[host."https://docker.chenby.cn"]
  capabilities = ["pull", "resolve"]
EOF


#重启containerd生效
systemctl restart containerd

#测试
crictl pull nginx
nerdctl --insecure-registry pull nginx

三、containerd工具使用

1.ctr工具使用

ctr是containerd自带的客户端工具,在containerd中拉取docker的相关镜像需要补全。ctr 默认操作的是 default 命名空间

bash 复制代码
#查看版本
[root@node-3 docker.io]# ctr version
Client:
  Version: v1.6.4
  Revision: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
  Go version: go1.17.9

Server:
  Version: v1.6.4
  Revision: 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
  UUID: 6af5e48b-d215-47c4-bb53-00f8144aa82b


#拉取镜像
[root@node-3 docker.io]# ctr -n k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/pause:3.9: resolved |++++++++++++++++++++++++++++++++++++++| 
index-sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097: exists |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:8d4106c88ec0bd28001e34c975d65175d994072d65341f62a8ab0754b0fafe10: exists |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:61fec91190a0bab34406027bbec43d562218df6e80d22d4735029756f23c7007: exists |++++++++++++++++++++++++++++++++++++++| 
config-sha256:e6f1816883972d4be47bd48879a08919b96afcd344132622e4d444987919323c: exists |++++++++++++++++++++++++++++++++++++++| 
elapsed: 0.7 s total: 0.0 B (0.0 B/s) 
unpacking linux/amd64 sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097...
done: 11.142817ms 

#查看镜像
[root@node-3 docker.io]# ctr -n k8s.io image ls

#其他操作命令请查看帮助信息
[root@node-3 docker.io]# ctr -h

2.crictl工具使用

由于ctr 命令设计的 [registry/]repository:tag 格式确实不够直观,尤其是默认镜像(如 nginx)需要完整路径 docker.io/library/nginx,使用起来比较繁琐,个人觉得可以使用crictl替代。

crictl是kubernetes cri-tools的一部分,是专门为kubernetes使用containerd而专门制作的,提供了Pod、容器和镜像等资源的管理命令。

crictl主要用于Kubernetes环境中,适用于集群管理,特别是在Kubernetes中进行容器管理时更加高效‌。

crictl 是 Kubernetes 社区维护的 CLI,默认兼容 Docker 镜像格式,自动补全 docker.io/library/。

crictl 是 Kubernetes 中用于与容器运行时接口(CRI)交互的命令行工具,支持 containerd、CRI-O 等 CRI 兼容的运行时。它主要用于节点级容器和 Pod 的调试、状态查看及资源管理,提供比 kubectl 更底层的操作能力。

2.1 安装
bash 复制代码
#下载
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.21.0/crictl-v1.21.0-linux-amd64.tar.gz
#安装
tar zxvf crictl-v1.21.0-linux-amd64.tar.gz -C /usr/local/bin
#查看版本
[root@node-3 ~]# crictl --version
crictl version 1.20.0-24-g53ad8bb7
2.2 配置/etc/crictl.yaml
bash 复制代码
[root@node-3 ~]# cat /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
2.3 常用命令解读
bash 复制代码
#查看运行中的容器(-a 包含已停止的)
crictl ps 
#查看容器详细信息
crictl inspect <container-id> 
#查看容器日志
crictl logs <container-id>
#在容器内执行命令 
crictl exec -it <container-id> <command>
#停止容器 
crictl stop <container-id> 
#删除容器
crictl rm <container-id>

#更多其他命令查看帮助
crictl --help

3.nerdctl工具使用

nerdctl 是专为 containerd 设计的命令行工具,提供与 Docker 相似的体验,同时支持 containerd 的高级特性(如命名空间管理、OCI 镜像转换、Compose 等)。适用于 Kubernetes 环境或直接管理 containerd 容器。

nerdctl 作为 containerd 的友好 CLI 工具,完美适配 Kubernetes 环境,同时保留了 Docker 的使用习惯。

核心优势:

  • 兼容 Docker 命令:如 run、build、compose。

  • 支持 Kubernetes 命名空间:直接管理 k8s.io 命名空间下的容器。

  • 集成 BuildKit:支持高效镜像构建和懒加载(lazy-pulling)。

3.1 安装部署
bash 复制代码
[root@node-3 ~]# wget https://github.com/containerd/nerdctl/releases/download/v1.2.1/nerdctl-1.2.1-linux-amd64.tar.gz
[root@node-3 ~]# tar xvf nerdctl-1.2.1-linux-amd64.tar.gz -C /usr/local/bin
3.2 基础命令使用
bash 复制代码
#1. 容器管理

#启动临时容器
nerdctl run -it --rm alpine 
#查看所有容器
nerdctl ps -a 
#查看容器日志
nerdctl logs <容器ID> 
#进入容器 Shell
nerdctl exec -it <容器ID> sh
#停止/删除容器 
nerdctl stop/rm <容器ID> 


#2. 镜像管理
#拉取镜像
nerdctl pull nginx:latest
#查看本地镜像 
nerdctl images 
#删除镜像
nerdctl rmi <镜像ID> 
#推送镜像到仓库
nerdctl push myimage:latest 


#3. 管理 Kubernetes 命名空间
# 拉取镜像到 k8s.io 命名空间(Kubernetes 可见)
nerdctl -n k8s.io pull nginx:latest

# 查看命名空间
nerdctl namespace ls

四、安全与优化​​​​​​​

生产环境中,确保Containerd的安全性和性能至关重要:``

1.最小权限:运行Containerd服务的账户应具有最小权限。``

2.监控与日志:设置日志记录和实时监控,以便快速响应异常情况。``

3.资源管理:合理分配CPU和内存资源,避免资源竞争导致的性能瓶颈。

以上内容详细介绍了在生产环境中专业部署和配置 Containerd 的方法,下一章节我们将深入探讨 Kubernetes 容器运行时从 Docker 迁移到 Containerd 的完整方案。

相关推荐
国际云21 分钟前
腾讯云国际版和国内版账户通用吗?一样吗?为什么?
大数据·运维·阿里云·云计算
愚润求学41 分钟前
【Linux】POSIX信号量
linux·运维
局外人LZ1 小时前
Docker轻松搭建Neo4j+APOC环境
docker·容器·neo4j
进阶的DW1 小时前
新手小白使用VMware创建虚拟机安装Linux
java·linux·运维
jz_ddk1 小时前
[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)
linux·运维·c语言·网络·嵌入式硬件
ZStack开发者社区1 小时前
全球化2.0|云轴科技ZStack助力香港服务机构VMware替代
运维·云计算·政务
小黄人软件2 小时前
jenkins脚本查看及备份
运维·servlet·jenkins
字节高级特工2 小时前
【Linux篇】0基础之学习操作系统进程
linux·运维·服务器·数据结构·windows·学习·list
文牧之2 小时前
PostgreSQL 的扩展pg_prewarm
运维·数据库·postgresql
s_little_monster2 小时前
【Linux】网络--数据链路层--以太网
linux·运维·网络·经验分享·笔记·学习·计算机网络