能,但非无感替换:nerdctl兼容docker cli语法,但基于containerd,不支持docker context、--volumes清理、--network host等;build参数类似但需显式指定--platform;rootless模式导致网络和挂载行为差异;compose仅支持v2规范且需手动加载.env。

nerdctl 能直接替代 docker 命令吗
能,但不是无感替换。nerdctl 设计目标就是兼容 docker CLI 语法,绝大多数 docker run、docker build、docker ps 都能照搬,但背后用的是 containerd,不经过 dockerd,所以部分依赖 Docker daemon 特性的场景会失效。
-
docker context不支持(nerdctl 没 context 概念,靠--namespace或配置文件切换) -
docker system prune -a --volumes中的--volumes无效(nerdctl 的prune不清理卷,得手动删/var/lib/nerdctl/下对应目录) -
docker exec -it进容器后,ps看不到其他进程(因为默认用 rootless 容器,PID namespace 隔离更严格)
如果你在 CI 或脚本里硬编码了 docker 命令,换 nerdctl 前先跑一遍 nerdctl version 和 nerdctl info,确认后端是 containerd 且没报 rootless not supported 类错误。
nerdctl build 怎么复用 docker build 的参数
大部分参数一致,但关键差异在构建上下文和缓存机制。nerdctl 默认用 BuildKit,所以 --no-cache、--progress=plain、--secret 都可用,但 --build-arg 和 --platform 行为略有不同。
-
--platform必须显式指定,比如nerdctl build --platform linux/amd64 -t myapp .;docker CLI 在 M1 上可能自动 fallback,nerdctl 不会 -
--build-arg可以传,但若 Dockerfile 里用了ARG却没在命令行给值,nerdctl 会报错退出,docker 则静默设为空字符串 -
-f指定 Dockerfile 路径时,路径必须相对于构建上下文根目录,不能是绝对路径(nerdctl build -f /tmp/Dockerfile .会失败)
常见踩坑:CI 里用 docker build -f ./ci/Dockerfile .,换成 nerdctl 后忘了把 . 改成 ./ci,结果构建时找不到依赖文件。
立即学习“Python免费学习笔记(深入)”;
nerdctl run 的网络和挂载为什么经常连不上 host
因为 nerdctl 默认启用 rootless 模式,host 网络栈不可见,--network host 实际被忽略,等价于 --network bridge;挂载宿主机路径时,权限和用户映射也更严格。
-
--network host:nerdctl 不支持,改用--network slirp4netns(默认)或--network cni(需提前配好 CNI 插件) -
-v /etc:/host-etc:ro:rootless 下会因 uid/gid 映射失败而报permission denied,解决办法是加--userns=keep-id或改用--user $(id -u):$(id -g) -
-p 8080:80:端口映射实际由 slirp4netns 实现,性能低于 dockerd,且不支持127.0.0.1:8080绑定写法,只能写8080:80
典型现象:本地开发用 nerdctl run -p 3000:3000 启服务,curl localhost:3000 失败——其实是 slirp4netns 把端口映射到了 127.0.0.1:3000,但某些旧版 nerdctl(
nerdctl 和 docker-compose 兼容性怎么样
nerdctl 自带 nerdctl compose 子命令,但只支持 Compose Spec v2.x,且不支持 docker-compose.yml 里所有字段。
- 支持:
services、volumes、networks、build.context、ports、environment - 不支持:
deploy.resources.limits(containerd runtime 不识别)、init: true(nerdctl 没 init 进程管理)、profiles字段完全忽略 -
extends和env_file可用,但env_file路径必须相对于compose.yml所在目录,不能是绝对路径
最容易被忽略的一点:nerdctl compose 默认不加载 .env 文件,得显式加 --env-file .env 参数,否则 ${DB_HOST} 这类变量全为空。另外,nerdctl compose up 启动后 Ctrl+C 不会自动清理网络和卷,得手动 nerdctl compose down。










