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 sudo apt-get updatesudo apt-get install -y libseccomp2 socat iproute2 iptablessudo yum install -y libseccomp socat iproute iptables
2.2 核心安装与初始化
下载并解压 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
生成配置并启动Containerd服务
1 2 3 4 5 6 7 sudo containerd config default > /etc/containerd/config.tomlsudo vi /etc/containerd/config.tomlsudo systemctl daemon-reloadsudo systemctl enable --now containerd
验证基础安装
1 2 3 sudo containerd --versionnerdctl version sudo nerdctl run --rm hello-world
2.3 服务管理
2.4 设置Rootless无根模式(关键安全实践) 允许非root用户安全地运行容器,是生产环境的重要安全加固步骤。
安装用户态依赖 :
1 2 3 4 sudo apt-get install -y uidmap slirp4netns fuse-overlayfssudo 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 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命名空间 。
4.3 容器编排:Nerdctl Compose nerdctl支持docker-compose.yml格式的编排文件,用于本地多容器应用管理。
1 2 3 4 5 6 7 8 nerdctl compose up -d nerdctl compose ps nerdctl compose down nerdctl compose logs -f
4.4 网络与数据卷管理
总结与建议
场景选择 :若你的工作流深度依赖Kubernetes ,或追求极致的轻量化和安全性 ,nerdctl+containerd是理想选择。若开发环境需要一体化的桌面体验和图形界面 ,Docker Desktop仍有其价值。
运维核心 :
牢记命名空间 :区分管理k8s.io和默认命名空间的资源。
拥抱Rootless :生产环境应优先采用Rootless模式运行非特权容器。
善用config.toml :正确配置镜像加速、cgroup驱动和私有仓库是稳定运行的基础。
迁移路径 :从Docker迁移时,建议先在测试环境熟悉nerdctl命令和命名空间概念,并严格按照kubelet配置变更流程操作。
该技术栈代表容器运行时的发展方向,随着Kubernetes的统治地位日益巩固,containerd作为其默认运行时,与配套工具nerdctl的协同将变得更加普遍和重要。