nerdctl常见问题和疑难解答

转载官方地址 nerdctl/docs/faq.md at v2.0.0 · containerd/nerdctl · GitHub

常见问题和疑难解答

项目

nerdctl 与 有何不同docker

nerdctl 的目标是帮助实验 Docker 中不存在的 containerd 的尖端功能。

这些功能包括但不限于按需镜像拉取(延迟拉取)镜像加密/解密。另请参阅../README.mdnerdctl 中存在但 Docker 中不存在的功能列表(反之亦然)。

请注意,与 Docker 竞争并不是nerdctl 的目标。这些尖端功能预计最终也将在 Docker 中提供。

ctrnerdctl 与和有何不同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 Maccolima也提供带有 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 用户也必须指定--addresssudo 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/bin700Admin 非常重要,否则非预期用户可能会通过 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>

参见:

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值