基于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
2
3
4
5
# 基于Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y libseccomp2 socat iproute2 iptables
# 基于RHEL/CentOS/Fedora
sudo yum install -y libseccomp socat iproute iptables

2.2 核心安装与初始化

  1. 下载并解压 nerdctl-full
    访问 nerdctl GitHub Releases 获取最新稳定版。

    1
    2
    3
    export 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
  2. 生成配置并启动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
  3. 验证基础安装

    1
    2
    3
    sudo containerd --version
    nerdctl version
    sudo nerdctl run --rm hello-world # 运行测试容器

2.3 服务管理

  • Containerd服务

    1
    2
    3
    sudo 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. 安装用户态依赖

    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
  2. 执行Rootless安装脚本
    nerdctl-full包内提供了便捷的设置工具。

    1
    containerd-rootless-setuptool.sh install

    该脚本会自动配置用户命名空间、cgroup委托等。安装后,注销并重新登录使用户组变更生效。

  3. 验证与使用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
2
3
4
5
version = 2
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io", "https://mirror.ccs.tencentyun.com"]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true

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
    2
    nerdctl -n k8s.io pull nginx:alpine  # 拉取镜像到k8s.io命名空间
    nerdctl -n k8s.io images # 查看供K8s使用的镜像
  • 调试Kubernetes Pod

    1
    2
    nerdctl -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
2
3
4
5
6
7
8
# 启动一个Compose项目(需在docker-compose.yml所在目录)
nerdctl compose up -d
# 查看状态
nerdctl compose ps
# 停止并清理
nerdctl compose down
# 查看日志
nerdctl compose logs -f

4.4 网络与数据卷管理

  • 网络nerdctl默认使用CNI插件管理容器网络。

    1
    2
    nerdctl network ls                 # 列出网络
    nerdctl network create my-net # 创建自定义网络
  • 数据卷

    1
    2
    nerdctl volume create my-vol       # 创建数据卷
    nerdctl volume ls # 列出数据卷

总结与建议

  1. 场景选择:若你的工作流深度依赖Kubernetes,或追求极致的轻量化和安全性nerdctl+containerd是理想选择。若开发环境需要一体化的桌面体验和图形界面,Docker Desktop仍有其价值。
  2. 运维核心
    • 牢记命名空间:区分管理k8s.io和默认命名空间的资源。
    • 拥抱Rootless:生产环境应优先采用Rootless模式运行非特权容器。
    • **善用config.toml**:正确配置镜像加速、cgroup驱动和私有仓库是稳定运行的基础。
  3. 迁移路径:从Docker迁移时,建议先在测试环境熟悉nerdctl命令和命名空间概念,并严格按照kubelet配置变更流程操作。

该技术栈代表容器运行时的发展方向,随着Kubernetes的统治地位日益巩固,containerd作为其默认运行时,与配套工具nerdctl的协同将变得更加普遍和重要。