基于Nerdctl与Containerd的系统部署技术指南
1. 相对于Docker的核心优势
基于 nerdctl(容器CLI工具)和 containerd(行业标准容器运行时)的容器化部署栈,是现代化、云原生优先的架构选择。相较于传统的Docker引擎,其核心优势体现在架构、性能、安全性和生态集成等多个维度。
| 特性维度 | Nerdctl + Containerd | Docker Engine | 优势分析与影响 |
|---|---|---|---|
| 架构与定位 | 模块化、解耦。Containerd作为底层运行时,Nerdctl为兼容Docker CLI的客户端工具。 | 单体、一体化。Docker Daemon (dockerd) 集成了运行时、构建、网络、存储等多种功能。 |
更轻量、更专注。Containerd仅负责核心的容器生命周期管理,减少了攻击面和资源开销,符合Unix哲学。 |
| 与Kubernetes集成 | 原生、深度集成。Kubernetes通过Container Runtime Interface (CRI) 直接调用Containerd。 | 间接、桥接。历史上通过dockershim(已弃用),现需额外组件cri-dockerd桥接。 |
路径更短、更稳定高效。作为K8s默认运行时,移除中间层,减少了故障点,是生产集群的官方推荐方案。 |
| 资源占用 | 极低。仅包含核心运行时,无冗余守护进程。 | 较高。包含完整的Docker Daemon及其附加功能。 | 显著节省系统资源,尤其适用于大规模集群、边缘计算和资源受限环境。 |
| 安全模型 | 强大的Rootless容器支持。利用RootlessKit和用户命名空间映射,实现非特权用户运行容器,极大提升安全性。 |
Rootless模式相对成熟但集成度与生态稍逊。 | 有效遏制容器逃逸风险,将安全漏洞的影响范围限制在非特权用户内,是生产环境关键安全实践。 |
| 核心特性 | 1. 命名空间隔离:支持多租户(如隔离k8s.io和默认命名空间)。2. **延迟拉取(Stargz)**:加速大镜像启动。 3. 镜像加密等实验性功能。 |
生态成熟,桌面体验和开发者工具链(如Docker Compose)完善。 | 更专注于探索容器技术前沿,与K8s原生特性(如多租户)结合更紧密。 |
| CLI兼容性 | Nerdctl命令与 docker 命令高度兼容,支持绝大部分常用命令和标志。 |
拥有最完整、统一的命令行生态。 | 学习迁移成本极低,熟悉Docker的用户可以几乎无缝切换。 |
2. 安装与设置步骤(基于nerdctl-full一体包)
nerdctl-full发行版包含了运行完整容器环境所需的所有组件(containerd, nerdctl, CNI插件, BuildKit, RootlessKit等),是推荐的部署方式。
2.1 系统依赖与环境准备
确保系统已安装基础依赖,这些通常是现代Linux发行版的标配。
1 | # 基于Debian/Ubuntu |
2.2 核心安装与初始化
下载并解压
nerdctl-full
访问 nerdctl GitHub Releases 获取最新稳定版。1
2
3export NERDCTL_VERSION="1.7.6" # 请替换为最新版本
wget "https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz"
sudo tar Cxzvf /usr nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz生成配置并启动Containerd服务
1
2
3
4
5
6
7# 生成默认配置文件
sudo containerd config default > /etc/containerd/config.toml
# 编辑配置文件(详见第3部分)
sudo vi /etc/containerd/config.toml
# 启动并设置开机自启
sudo systemctl daemon-reload
sudo systemctl enable --now containerd验证基础安装
1
2
3sudo containerd --version
nerdctl version
sudo nerdctl run --rm hello-world # 运行测试容器
2.3 服务管理
Containerd服务:
1
2
3sudo systemctl status containerd
sudo systemctl restart containerd
sudo journalctl -u containerd -f # 查看日志BuildKit服务(用于镜像构建):
nerdctl-full包含BuildKit,建议启用其服务以支持nerdctl build。1
sudo systemctl enable --now buildkit
2.4 设置Rootless无根模式(关键安全实践)
允许非root用户安全地运行容器,是生产环境的重要安全加固步骤。
安装用户态依赖:
1
2
3
4# Ubuntu/Debian
sudo apt-get install -y uidmap slirp4netns fuse-overlayfs
# RHEL/Fedora/CentOS
sudo yum install -y shadow-utils slirp4netns fuse-overlayfs执行Rootless安装脚本:
nerdctl-full包内提供了便捷的设置工具。1
containerd-rootless-setuptool.sh install
该脚本会自动配置用户命名空间、cgroup委托等。安装后,注销并重新登录使用户组变更生效。
验证与使用Rootless模式:
1
2
3
4# 以普通用户身份操作
id # 确认用户
nerdctl run -d -p 8080:80 --name my-nginx nginx:alpine
nerdctl ps重要:Rootless模式下,容器网络、端口映射(通常只支持>1024的端口)、存储驱动(如
fuse-overlayfs)与特权模式有所不同,需适应。
3. Containerd常用配置 (/etc/containerd/config.toml)
config.toml是Containerd的核心配置文件。以下为关键配置项,修改后需执行 sudo systemctl restart containerd。
| 配置分类 | 配置项路径 (TOML) | 推荐值/示例 | 作用说明 |
|---|---|---|---|
| 镜像仓库代理/加速 | plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io" |
endpoint = ["https://<your-mirror>"] |
配置国内镜像加速器(如阿里云、中科大源),解决拉取慢问题。 |
| 日志配置 | plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options |
SystemdCgroup = true |
可配置容器日志的格式、大小和保留策略。 |
| 数据存储目录 | root |
/var/lib/containerd |
Containerd工作根目录。可更改为更大容量的磁盘路径。 |
| 私有仓库认证 | plugins."io.containerd.grpc.v1.cri".registry.configs."myreg.com".auth |
username="<user>", password="<pass>" |
配置访问私有镜像仓库的认证信息。支持credsStore使用本地凭证助手。 |
| Sandbox 镜像 | plugins."io.containerd.grpc.v1.cri".sandbox_image |
registry.aliyuncs.com/google_containers/pause:3.9 |
替换K8s Pod基础镜像,通常用于解决gcr.io访问问题。 |
| Cgroup 驱动 | plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.SystemdCgroup |
true |
必须与Kubelet的cgroup驱动一致。对于使用systemd作为init系统的发行版,设为true。 |
| 运行时数据目录 | state |
/run/containerd |
运行时状态目录。 |
| 默认运行时 | plugins."io.containerd.grpc.v1.cri".containerd.default_runtime |
name = "runc" |
设置默认的底层OCI运行时(如runc, kata, gVisor)。 |
配置片段示例(镜像加速与cgroup驱动):
1 | version = 2 |
4. 容器管理与编排常用命令
4.1 基本容器管理(类比Docker)
nerdctl命令与docker高度相似,以下为常用操作:
| 功能 | Nerdctl命令示例 | 说明 |
|---|---|---|
| 拉取镜像 | nerdctl pull nginx:alpine |
从仓库拉取镜像。 |
| 运行容器 | nerdctl run -d --name web -p 80:80 nginx:alpine |
后台运行容器并映射端口。 |
| 列出容器 | nerdctl ps -a |
查看所有容器(含停止的)。 |
| 执行命令 | nerdctl exec -it web sh |
进入运行中的容器。 |
| 查看日志 | nerdctl logs -f web |
跟踪容器日志。 |
| 停止/删除 | nerdctl stop web && nerdctl rm web |
停止并删除容器。 |
| 构建镜像 | nerdctl build -t myapp:latest . |
使用当前目录Dockerfile构建镜像(需BuildKit服务)。 |
| 镜像管理 | nerdctl images, nerdctl rmi <image> |
列出、删除镜像。 |
4.2 关键概念:命名空间管理
这是与Docker管理上最重要的区别。Containerd使用命名空间隔离容器、镜像等资源。Kubernetes创建的Pod默认都在k8s.io命名空间。
为Kubernetes准备镜像:
1
2nerdctl -n k8s.io pull nginx:alpine # 拉取镜像到k8s.io命名空间
nerdctl -n k8s.io images # 查看供K8s使用的镜像调试Kubernetes Pod:
1
2nerdctl -n k8s.io ps -a | grep <pod-name> # 查找对应容器
nerdctl -n k8s.io logs <container-id> # 查看容器日志管理独立容器(非K8s管理):默认在
default命名空间,可省略-n default。
4.3 容器编排:Nerdctl Compose
nerdctl支持docker-compose.yml格式的编排文件,用于本地多容器应用管理。
1 | # 启动一个Compose项目(需在docker-compose.yml所在目录) |
4.4 网络与数据卷管理
网络:
nerdctl默认使用CNI插件管理容器网络。1
2nerdctl network ls # 列出网络
nerdctl network create my-net # 创建自定义网络数据卷:
1
2nerdctl volume create my-vol # 创建数据卷
nerdctl volume ls # 列出数据卷
总结与建议
- 场景选择:若你的工作流深度依赖Kubernetes,或追求极致的轻量化和安全性,
nerdctl+containerd是理想选择。若开发环境需要一体化的桌面体验和图形界面,Docker Desktop仍有其价值。 - 运维核心:
- 牢记命名空间:区分管理
k8s.io和默认命名空间的资源。 - 拥抱Rootless:生产环境应优先采用Rootless模式运行非特权容器。
- **善用
config.toml**:正确配置镜像加速、cgroup驱动和私有仓库是稳定运行的基础。
- 牢记命名空间:区分管理
- 迁移路径:从Docker迁移时,建议先在测试环境熟悉nerdctl命令和命名空间概念,并严格按照
kubelet配置变更流程操作。
该技术栈代表容器运行时的发展方向,随着Kubernetes的统治地位日益巩固,containerd作为其默认运行时,与配套工具nerdctl的协同将变得更加普遍和重要。