转载官方地址 nerdctl/docs/faq.md at v2.0.0 · containerd/nerdctl · GitHub
常见问题和疑难解答
- 项目
- Mac 和 Windows
- 配置
- Kubernetes
- containerd 套接字地址
- 无根
- 如何以非 root 用户身份使用 nerdctl?(无 root 模式)
- nerdctl run -p <PORT>不传播源 IP
- nerdctl run -p <PORT>不适用于 1024 以下的端口号
- 无法 ping
- 主机重启后容器不会自动启动
- 错误failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: unable to apply cgroup configuration: unable to start unit ... {Name:Slice Value:"user.slice"} {Name:Delegate Value:true} ... Permission denied: unknown
- 如何卸载?/无法删除~/.local/share/containerd
项目
nerdctl 与 有何不同docker
?
nerdctl 的目标是帮助实验 Docker 中不存在的 containerd 的尖端功能。
这些功能包括但不限于按需镜像拉取(延迟拉取)和镜像加密/解密。另请参阅../README.mdnerdctl 中存在但 Docker 中不存在的功能列表(反之亦然)。
请注意,与 Docker 竞争并不是nerdctl 的目标。这些尖端功能预计最终也将在 Docker 中提供。
ctr
nerdctl 与和有何不同crictl
?
ctr是与 containerd 捆绑在一起的调试实用程序。
ctr 与 Docker CLI 不兼容,对用户不友好。
值得注意的是,ctr
缺少以下 nerdctl 命令的等效项:
nerdctl run -p <PORT>
nerdctl run --restart=always --net=bridge
nerdctl pull
使用~/.docker/config.json
和凭证辅助二进制文件,例如docker-credential-ecr-login
nerdctl logs
nerdctl build
nerdctl compose up
crictl也有类似的限制。
Mac 和 Windows
nerdctl 能在 macOS 上运行吗?
是的,通过 Linux 虚拟机。
Lima项目为 macOS 提供 Linux 虚拟机,并内置集成 nerdctl。
$ brew install lima
$ limactl start
$ lima nerdctl run -d --name nginx -p 127.0.0.1:8080:80 nginx:alpine
Rancher Desktop for Mac和colima也提供带有 nerdctl 的定制 Lima 机器。
nerdctl 能在 Windows 上运行吗?
Windows 容器:是的,但是是实验性的。
Linux 容器:是的,通过 WSL2。Rancher Desktop for Windows提供了一个nerdctl.exe
在 WSL2 机器中包装 nerdctl 二进制文件的程序。
配置
nerdctl 忽略[plugins."io.containerd.grpc.v1.cri"]
配置
预期行为,因为 nerdctl 不使用 CRI(Kubernetes 容器运行时接口)API。
请参阅下面的问题以了解如何配置 nerdctl。
如何登录注册表?
使用nerdctl login
,或者只是创建~/.docker/config.json
。nerdctl 还支持凭证帮助程序二进制文件,例如docker-credential-ecr-login
。
如何使用非 HTTPS 注册表?
使用nerdctl --insecure-registry run <IMAGE>
。另请参阅registry.md。
如何指定注册中心的CA证书?
创建~/.config/containerd/certs.d/<HOST:PORT>/hosts.toml
(或/etc/containerd/certs.d/...
对于rootful)以指定ca
证书。
# An example of ~/.config/containerd/certs.d/192.168.12.34:5000/hosts.toml
# (The path is "/etc/containerd/certs.d/192.168.12.34:5000/hosts.toml" for rootful)
server = "https://192.168.12.34:5000"
[host."https://192.168.12.34:5000"]
ca = "/path/to/ca.crt"
请参阅https://github.com/containerd/containerd/blob/main/docs/hosts.md了解 的语法hosts.toml
。
还支持 Docker 样式的目录。路径~/.config/docker/certs.d
适用于 rootless,/etc/docker/certs.d
适用于 rootful。
另请参阅registry.md。
如何更改 cgroup 驱动程序?
- 选项 1:
nerdctl --cgroup-manager=(cgroupfs|systemd|none)
。 - 选项 2:设置
cgroup_manager
属性nerdctl.toml
默认值systemd
在 cgroup v2 主机(rootful 和 rootless)上、cgroupfs
在 cgroup v1 rootful 主机上、none
在 cgroup v1 rootless 主机上。
提示:Kubernetes 的相应配置(io.containerd.grpc.v1.cri
)
如何更改快照程序?
- 选项 1:使用
nerdctl --snapshotter=(overlayfs|native|btrfs|...)
- 选项 2:设置
$CONTAINERD_SNAPSHOTTER
- 选项 3:设置
snapshotter
属性nerdctl.toml
默认值为overlayfs
。
提示:Kubernetes 的相应配置(io.containerd.grpc.v1.cri
)
如何更改运行时?
使用nerdctl run --runtime=<RUNTIME>
。
该<RUNTIME>
字符串可以是 containerd 运行时插件名称(例如io.containerd.runc.v2
),也可以是 runc 兼容二进制文件的路径(例如/usr/local/sbin/runc
)。
提示:Kubernetes 的相应配置(io.containerd.grpc.v1.cri
)
如何更改 CNI 二进制路径?
- 选项 1:使用
nerdctl --cni-path=<PATH>
- 选项 2:设置
$CNI_PATH
- 选项 3:
cni_path
在 中设置属性nerdctl.toml。
通过检查以下候选项自动检测默认值:
~/.local/libexec/cni
~/.local/lib/cni
~/opt/cni/bin
/usr/local/libexec/cni
/usr/local/lib/cni
/usr/libexec/cni
/usr/lib/cni
/opt/cni/bin
提示:Kubernetes 的相应配置(io.containerd.grpc.v1.cri
)
Kubernetes
nerdctl ps -a
不显示 Kubernetes 容器
尝试sudo nerdctl --namespace=k8s.io ps -a
。
注意:k3s 用户也必须指定--address
:sudo nerdctl --address=/run/k3s/containerd/containerd.sock --namespace=k8s.io ps -a
如何为 Kubernetes 构建镜像?
对于多节点群集:
$ nerdctl build -t example.com/foo /some-dockerfile-directory
$ nerdctl push example.com/foo
对于没有注册表的单节点集群:
# nerdctl --namespace k8s.io build -t foo /some-dockerfile-directory
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: foo
imagePullPolicy: Never
EOF
containerd 套接字地址
- 根深蒂固:
/run/containerd/containerd.sock
- 无根(例如默认的Lima实例):,
/proc/<PID of containerd>/root/run/containerd/containerd.sock
或者您可以运行此命令来找出原因:(echo /proc/$(cat $XDG_RUNTIME_DIR/containerd-rootless/child_pid)/root/run/containerd/containerd.sock
为什么它有效 rootlessutil.ParentMain:)
nerdctl 有相当于 的吗DOCKER_HOST=ssh://<USER>@<REMOTEHOST>
?
不,只需使用ssh -l <USER> <REMOTEHOST> nerdctl
。
nerdctl 有相当于 的吗sudo usermod -aG docker <USER>
?
不完全相同,但在二进制chmod +s
上设置 SETUID 位()nerdctl
可提供类似的用户体验。
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>mkdir -p $HOME/bin
chmod 700 $HOME/bin
cp /usr/local/bin/nerdctl $HOME/bin
sudo chown root $HOME/bin/nerdctl
sudo chmod +s $HOME/bin/nerdctl
export PATH=$HOME/bin:$PATH
</code></span></span></span></span>
修改$HOME/bin
为700
Admin 非常重要,否则非预期用户可能会通过 SETUID 位获得 root 权限。
强烈建议不要使用 SETUID 位。尽可能考虑使用Rootless 模式。
无根
如何以非 root 用户身份使用 nerdctl?(无 root 模式)
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>containerd-rootless-setuptool.sh install
nerdctl run -d --name nginx -p 8080:80 nginx:alpine
</code></span></span></span></span>
参见:
- rootless.md
- Common steps (Read first!) | Rootless Containers
- containerd (nerdctl) | Rootless Containers
nerdctl run -p <PORT>
不传播源 IP
默认端口驱动程序的预期行为rootlesskit
。
解决办法是将端口驱动程序改为slirp4netns
(牺牲性能)。
请参阅containerd (nerdctl) | Rootless Containers。
nerdctl run -p <PORT>
不适用于 1024 以下的端口号
设置 sysctl 值net.ipv4.ip_unprivileged_port_start=0
。
请参阅[Optional] sysctl | Rootless Containers
无法 ping
设置 sysctl 值net.ipv4.ping_group_range=0 2147483647
。
参见[Optional] sysctl | Rootless Containers
主机重启后容器不会自动启动
跑步sudo loginctl enable-linger $(whoami)
。
请参阅Login | Rootless Containers。
错误failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: unable to apply cgroup configuration: unable to start unit ... {Name:Slice Value:"user.slice"} {Name:Delegate Value:true} ... Permission denied: unknown
使用 cgroup 驱动程序运行无根容器systemd
需要 dbus 作为用户会话服务运行。
否则 runc 可能会失败并出现如下错误:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>FATA[0000] failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: unable to apply cgroup configuration: unable to start unit "nerdctl-7bda4abaa1f006ab9feeb98c06953db43f212f1c0aaf658fb8a88d6f63dff9f9.scope" (properties [{Name:Description Value:"libcontainer container 7bda4abaa1f006ab9feeb98c06953db43f212f1c0aaf658fb8a88d6f63dff9f9"} {Name:Slice Value:"user.slice"} {Name:Delegate Value:true} {Name:PIDs Value:@au [1154]} {Name:MemoryAccounting Value:true} {Name:CPUAccounting Value:true} {Name:IOAccounting Value:true} {Name:TasksAccounting Value:true} {Name:DefaultDependencies Value:false}]): Permission denied: unknown
</code></span></span></span></span>
解决方案:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>sudo apt-get install -y dbus-user-session
systemctl --user start dbus
</code></span></span></span></span>
如何卸载?/无法删除~/.local/share/containerd
运行以下命令:
<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>containerd-rootless-setuptool.sh uninstall
rootlesskit rm -rf ~/.local/share/containerd ~/.local/share/nerdctl ~/.config/containerd</code></span></span></span></span>