nerdctl是Containerd原生兼容Docker CLI语义的前端工具,支持docker ps/run/build等命令,需安装完整版、启用containerd与buildkit服务,并注意命名空间、缓存参数及compose隔离特性。

当你在Kubernetes 1.24+集群节点或单机环境中已弃用Docker、改用Containerd作为运行时,却仍想沿用熟悉的docker ps、docker run、docker build等命令时,nerdctl就是那个无缝衔接的替代方案——它不是模拟器,而是原生兼容Docker CLI语义的Containerd前端,无需修改脚本即可复用90%原有操作习惯。
安装nerdctl并启用基础运行环境
下载完整版安装包,它自带containerd、runc、CNI插件和buildkit组件,避免后续手动补依赖:
wget https://github.com/containerd/nerdctl/releases/download/v1.5.0/nerdctl-full-1.5.0-linux-amd64.tar.gz
解压到/usr/local,这是systemd服务文件默认查找二进制路径的位置,若改路径需同步修改/lib/systemd/system/containerd.service中ExecStart字段:
sudo tar Cxzvvf /usr/local nerdctl-full-1.5.0-linux-amd64.tar.gz
启动containerd及buildkit服务,二者缺一不可——nerdctl build依赖buildkitd提供构建能力,而containerd是底层运行时:
sudo systemctl enable containerd buildkit
sudo systemctl restart containerd buildkit
【必须确认buildkit已运行】:执行sudo systemctl is-active buildkit返回active,否则nerdctl build会报failed to dial: connection refused。
日常容器生命周期管理:直接套用Docker命令
nerdctl命令与Docker完全一致,连flag和子命令顺序都无需调整。例如查看所有容器:
nerdctl ps -a
运行一个Alpine容器并交互:
nerdctl run -it --rm alpine:latest sh
拉取私有Harbor镜像(自动识别registry前缀):
nerdctl pull harbor.example.com/project/app:v1.2
停止并删除容器:
nerdctl stop my-nginx && nerdctl rm my-nginx
注意:nerdctl默认使用k8s.io命名空间,与Kubernetes节点行为对齐,因此nerdctl ps看到的正是kubelet实际管理的容器,不会出现ctr在default命名空间下“找不到”的问题。
构建镜像:用nerdctl build替代docker build
方法一:使用Dockerfile构建(需确保buildkit服务正在运行)
nerdctl build -t myapp:latest .
方法二:指定buildkit后端为containerd(更稳定,避免runc worker权限问题)
nerdctl build --snapshotter=containerd --driver=buildkit --build-arg ENV=prod -t myapp:prod .
nerdctl build不支持--no-cache=true这种写法,正确格式是--no-cache(无等号、无引号),写错会导致缓存强制启用且无报错提示。
编排多容器应用:nerdctl compose完全兼容docker-compose.yml
第一步:准备标准docker-compose.yml,内容无需修改,nerdctl compose原生解析。
第二步:在项目目录下执行:
nerdctl compose up -d
第三步:查看服务状态:
nerdctl compose ps
第四步:进入某服务容器执行命令:
nerdctl compose exec web bash
nerdctl compose默认将网络和卷创建在k8s.io命名空间,与Kubernetes侧隔离,适合单机开发测试;如需与k8s共享镜像,无需额外操作——因为镜像本身就在同一命名空间。
镜像导出导入:跨环境迁移必备
导出镜像为tar包(兼容Docker save格式):
nerdctl save -o app.tar nginx:alpine
从tar包加载镜像(自动解压并注册到containerd):
nerdctl load -i app.tar
从Docker daemon导入已有镜像(仅限root用户,需Docker服务正在运行):
nerdctl docker-archive import /var/lib/docker/image/overlay2/repositories.json
这一步不能跳过docker-archive子命令,直接nerdctl import会失败,错误提示模糊,容易卡在“no such file”。











