无根模式
无根模式允许以非 root 用户身份运行 Docker 守护进程和容器,以减轻守护进程和容器运行时的潜在漏洞。
无根模式即使在安装 Docker 守护进程期间也不需要 root 权限,前提是满足前提条件。
工作原理
无根模式在用户命名空间内执行 Docker 守护进程和容器。这与userns-remap
模式非常相似,不同之处在于,在 userns-remap
模式下,守护进程本身以 root 权限运行,而在无根模式下,守护进程和容器都以非 root 权限运行。
无根模式不使用带有 SETUID
位或文件能力的二进制文件,除了 newuidmap
和 newgidmap
,这两个是允许在用户命名空间中使用多个 UID/GID 所必需的。
前提条件
您必须在主机上安装
newuidmap
和newgidmap
。这些命令在大多数发行版中由uidmap
包提供。/etc/subuid
和/etc/subgid
应包含该用户至少 65,536 个附属 UID/GID。在以下示例中,用户testuser
拥有 65,536 个附属 UID/GID (231072-296607)。
$ id -u
1001
$ whoami
testuser
$ grep ^$(whoami): /etc/subuid
testuser:231072:65536
$ grep ^$(whoami): /etc/subgid
testuser:231072:65536
特定发行版提示
提示
我们建议您使用 Ubuntu 内核。
如果未安装
dbus-user-session
包,请安装。运行sudo apt-get install -y dbus-user-session
并重新登录。如果未安装
uidmap
包,请安装。运行sudo apt-get install -y uidmap
。如果在用户未直接登录的终端中运行,则需要使用
sudo apt-get install -y systemd-container
安装systemd-container
,然后使用命令sudo machinectl shell TheUser@
切换到 TheUser。overlay2
存储驱动默认启用(Ubuntu 特定内核补丁)。Ubuntu 24.04 及更高版本默认启用受限的非特权用户命名空间,除非配置 AppArmor 配置文件以允许程序使用非特权用户命名空间,否则会阻止非特权进程创建用户命名空间。
如果您使用 deb 包安装
docker-ce-rootless-extras
(apt-get install docker-ce-rootless-extras
),那么rootlesskit
的 AppArmor 配置文件已经与apparmor
deb 包捆绑在一起。通过这种安装方法,您无需手动添加任何 AppArmor 配置。但是,如果您使用安装脚本安装无根额外组件,则必须手动添加rootlesskit
的 AppArmor 配置文件。创建并安装当前登录用户的 AppArmor 配置文件
$ filename=$(echo $HOME/bin/rootlesskit | sed -e s@^/@@ -e s@/@.@g) $ cat <<EOF > ~/${filename} abi <abi/4.0>, include <tunables/global> "$HOME/bin/rootlesskit" flags=(unconfined) { userns, include if exists <local/${filename}> } EOF $ sudo mv ~/${filename} /etc/apparmor.d/${filename}
重启 AppArmor。
$ systemctl restart apparmor.service
如果未安装
dbus-user-session
包,请安装。运行sudo apt-get install -y dbus-user-session
并重新登录。对于 Debian 11,建议安装
fuse-overlayfs
。运行sudo apt-get install -y fuse-overlayfs
。在 Debian 12 上不需要此步骤。无根 Docker 需要版本高于
v0.4.0
的slirp4netns
(未安装vpnkit
时)。使用以下命令检查您是否已安装:$ slirp4netns --version
如果您没有,请使用
sudo apt-get install -y slirp4netns
下载并安装,或者下载最新的发行版。
建议安装
fuse-overlayfs
。运行sudo pacman -S fuse-overlayfs
。将
kernel.unprivileged_userns_clone=1
添加到/etc/sysctl.conf
(或/etc/sysctl.d
),然后运行sudo sysctl --system
对于 openSUSE 15 和 SLES 15,建议安装
fuse-overlayfs
。运行sudo zypper install -y fuse-overlayfs
。在 openSUSE Tumbleweed 上不需要此步骤。需要运行
sudo modprobe ip_tables iptable_mangle iptable_nat iptable_filter
。根据配置,其他发行版也可能需要此操作。已知在 openSUSE 15 和 SLES 15 上工作正常。
对于 RHEL 8 和类似发行版,建议安装
fuse-overlayfs
。运行sudo dnf install -y fuse-overlayfs
。在 RHEL 9 和类似发行版上不需要此步骤。您可能需要运行
sudo dnf install -y iptables
。
已知限制
- 仅支持以下存储驱动
overlay2
(仅在使用内核 5.11 或更高版本或 Ubuntu 内核时)fuse-overlayfs
(仅在使用内核 4.18 或更高版本且已安装fuse-overlayfs
时)btrfs
(仅在使用内核 4.18 或更高版本,或~/.local/share/docker
以user_subvol_rm_allowed
挂载选项挂载时)vfs
- 仅当使用 cgroup v2 和 systemd 运行时才支持 Cgroup。请参阅限制资源。
- 不支持以下功能
- AppArmor
- 检查点
- Overlay 网络
- 暴露 SCTP 端口
- 要使用
ping
命令,请参阅路由 Ping 包。 - 要暴露特权 TCP/UDP 端口(< 1024),请参阅暴露特权端口。
- 在
docker inspect
中显示的IPAddress
在 RootlessKit 的网络命名空间内。这意味着如果不使用nsenter
进入网络命名空间,就无法从主机访问该 IP 地址。 - 主机网络 (
docker run --net=host
) 也在 RootlessKit 中命名空间化。 - 不支持将 NFS 挂载用作 Docker 的“数据根目录”。此限制并非无根模式特有。
安装
注意
如果系统范围的 Docker 守护进程已在运行,请考虑禁用它
$ sudo systemctl disable --now docker.service docker.socket $ sudo rm /var/run/docker.sock
如果您选择不关闭
docker
服务和套接字,您需要在下一节中使用--force
参数。目前没有已知问题,但在您关闭和禁用之前,您仍在运行有根 Docker。
如果您使用RPM/DEB 包安装了 Docker 20.10 或更高版本,您应该在 /usr/bin
中找到 dockerd-rootless-setuptool.sh
。
以非 root 用户身份运行 dockerd-rootless-setuptool.sh install
来设置守护进程
$ dockerd-rootless-setuptool.sh install
[INFO] Creating /home/testuser/.config/systemd/user/docker.service
...
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger testuser`
[INFO] Make sure the following environment variables are set (or add them to ~/.bashrc):
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
如果 dockerd-rootless-setuptool.sh
不存在,您可能需要手动安装 docker-ce-rootless-extras
包,例如:
$ sudo apt-get install -y docker-ce-rootless-extras
如果您没有运行 apt-get
和 dnf
等包管理器的权限,请考虑使用可在 https://get.docker.com/rootless 获取的安装脚本。由于 s390x
没有静态包,因此 s390x
不支持此方法。
$ curl -fsSL https://get.docker.com/rootless | sh
...
[INFO] Creating /home/testuser/.config/systemd/user/docker.service
...
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger testuser`
[INFO] Make sure the following environment variables are set (or add them to ~/.bashrc):
export PATH=/home/testuser/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock
二进制文件将安装在 ~/bin
中。
如果您遇到错误,请参阅故障排除。
卸载
要移除 Docker 守护进程的 systemd 服务,运行 dockerd-rootless-setuptool.sh uninstall
$ dockerd-rootless-setuptool.sh uninstall
+ systemctl --user stop docker.service
+ systemctl --user disable docker.service
Removed /home/testuser/.config/systemd/user/default.target.wants/docker.service.
[INFO] Uninstalled docker.service
[INFO] This uninstallation tool does NOT remove Docker binaries and data.
[INFO] To remove data, run: `/usr/bin/rootlesskit rm -rf /home/testuser/.local/share/docker`
如果您将 PATH 和 DOCKER_HOST 环境变量添加到 ~/.bashrc
中,请取消设置它们。
要移除数据目录,运行 rootlesskit rm -rf ~/.local/share/docker
。
要移除二进制文件,如果您使用包管理器安装了 Docker,请移除 docker-ce-rootless-extras
包。如果您使用 https://get.docker.com/rootless(参阅 不使用包管理器安装)安装了 Docker,请移除 ~/bin
下的二进制文件。
$ cd ~/bin
$ rm -f containerd containerd-shim containerd-shim-runc-v2 ctr docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh rootlesskit rootlesskit-docker-proxy runc vpnkit
用法
守护进程
systemd 单元文件安装在 ~/.config/systemd/user/docker.service
。
使用 systemctl --user
管理守护进程的生命周期
$ systemctl --user start docker
要在系统启动时启动守护进程,启用 systemd 服务和 lingering
$ systemctl --user enable docker
$ sudo loginctl enable-linger $(whoami)
不支持将无根 Docker 作为 systemd-wide 服务 (/etc/systemd/system/docker.service
) 启动,即使使用 User=
指令也不支持。
要在不使用 systemd 的情况下直接运行守护进程,您需要运行 dockerd-rootless.sh
而不是 dockerd
。
必须设置以下环境变量
$HOME
: 主目录$XDG_RUNTIME_DIR
: 一个临时目录,只有预期用户可以访问,例如~/.docker/run
。该目录应在每次主机关闭时移除。该目录可以在 tmpfs 上,但不应位于/tmp
下。将此目录放置在/tmp
下可能会受到 TOCTOU 攻击。
目录路径说明
- 套接字路径默认设置为
$XDG_RUNTIME_DIR/docker.sock
。$XDG_RUNTIME_DIR
通常设置为/run/user/$UID
。 - 数据目录默认设置为
~/.local/share/docker
。数据目录不应位于 NFS 上。 - 守护进程配置目录默认设置为
~/.config/docker
。此目录与客户端使用的~/.docker
不同。
客户端
您需要明确指定套接字路径或 CLI 上下文。
使用 $DOCKER_HOST
指定套接字路径
$ export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
$ docker run -d -p 8080:80 nginx
使用 docker context
指定 CLI 上下文
$ docker context use rootless
rootless
Current context is now "rootless"
$ docker run -d -p 8080:80 nginx
最佳实践
Docker 中的无根 Docker
要在“有根”Docker 内运行无根 Docker,请使用 docker:<version>-dind-rootless
镜像而不是 docker:<version>-dind
。
$ docker run -d --name dind-rootless --privileged docker:25.0-dind-rootless
docker:<version>-dind-rootless
镜像以非 root 用户(UID 1000)身份运行。但是,禁用 seccomp、AppArmor 和挂载掩码需要使用 --privileged
参数。
通过 TCP 暴露 Docker API 套接字
要通过 TCP 暴露 Docker API 套接字,您需要使用 DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="-p 0.0.0.0:2376:2376/tcp"
启动 dockerd-rootless.sh
。
$ DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="-p 0.0.0.0:2376:2376/tcp" \
dockerd-rootless.sh \
-H tcp://0.0.0.0:2376 \
--tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem
通过 SSH 暴露 Docker API 套接字
要通过 SSH 暴露 Docker API 套接字,您需要确保在远程主机上设置了 $DOCKER_HOST
。
$ ssh -l <REMOTEUSER> <REMOTEHOST> 'echo $DOCKER_HOST'
unix:///run/user/1001/docker.sock
$ docker -H ssh://<REMOTEUSER>@<REMOTEHOST> run ...
路由 Ping 包
在某些发行版上,ping
默认不起作用。
将 net.ipv4.ping_group_range = 0 2147483647
添加到 /etc/sysctl.conf
(或 /etc/sysctl.d
),然后运行 sudo sysctl --system
以允许使用 ping
。
暴露特权端口
要暴露特权端口(< 1024),请在 rootlesskit
二进制文件上设置 CAP_NET_BIND_SERVICE
并重启守护进程。
$ sudo setcap cap_net_bind_service=ep $(which rootlesskit)
$ systemctl --user restart docker
或者将 net.ipv4.ip_unprivileged_port_start=0
添加到 /etc/sysctl.conf
(或 /etc/sysctl.d
),然后运行 sudo sysctl --system
。
限制资源
仅当使用 cgroup v2 和 systemd 运行时,才支持使用与 cgroup 相关的 docker run
标志(例如 --cpus
、--memory
、--pids-limit
)来限制资源。请参阅更改 cgroup 版本以启用 cgroup v2。
如果 docker info
显示 Cgroup Driver
为 none
,则表示条件不满足。当这些条件不满足时,无根模式会忽略与 cgroup 相关的 docker run
标志。请参阅不使用 cgroup 限制资源以获取解决方法。
如果 docker info
显示 Cgroup Driver
为 systemd
,则表示条件满足。但是,通常默认情况下只有 memory
和 pids
控制器被委托给非 root 用户。
$ cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers
memory pids
要允许委托所有控制器,您需要更改 systemd 配置如下:
# mkdir -p /etc/systemd/system/user@.service.d
# cat > /etc/systemd/system/user@.service.d/delegate.conf << EOF
[Service]
Delegate=cpu cpuset io memory pids
EOF
# systemctl daemon-reload
注意
委托
cpuset
需要 systemd 244 或更高版本。
不使用 cgroup 限制资源
即使 cgroup 不可用,您仍然可以使用传统的 ulimit
和 cpulimit
,尽管它们工作在进程粒度而非容器粒度,并且可以被容器进程任意禁用。
例如
限制 CPU 使用量到 0.5 核(类似于
docker run --cpus 0.5
):docker run <IMAGE> cpulimit --limit=50 --include-children <COMMAND>
限制最大 VSZ 到 64MiB(类似于
docker run --memory 64m
):docker run <IMAGE> sh -c "ulimit -v 65536; <COMMAND>"
限制每个命名空间 UID 2000 的最大进程数为 100(类似于
docker run --pids-limit=100
):docker run --user 2000 --ulimit nproc=100 <IMAGE> <COMMAND>
故障排除
系统存在 systemd 时无法通过 systemd 安装
$ dockerd-rootless-setuptool.sh install
[INFO] systemd not detected, dockerd-rootless.sh needs to be started manually:
...
如果您通过 sudo su
切换到用户,rootlesskit
可能无法正确检测 systemd。对于无法登录的用户,您必须使用 machinectl
命令,该命令是 systemd-container
包的一部分。安装 systemd-container
后,使用以下命令切换到 myuser
$ sudo machinectl shell myuser@
其中 myuser@
是您想要使用的用户名,@ 表示本机。
启动 Docker 守护进程时出错
[rootlesskit:parent] error: failed to start the child: fork/exec /proc/self/exe: operation not permitted
此错误通常发生在 /proc/sys/kernel/unprivileged_userns_clone
的值设置为 0 时
$ cat /proc/sys/kernel/unprivileged_userns_clone
0
要解决此问题,将 kernel.unprivileged_userns_clone=1
添加到 /etc/sysctl.conf
(或 /etc/sysctl.d
)并运行 sudo sysctl --system
。
[rootlesskit:parent] error: failed to start the child: fork/exec /proc/self/exe: no space left on device
此错误通常发生在 /proc/sys/user/max_user_namespaces
的值太小时
$ cat /proc/sys/user/max_user_namespaces
0
要解决此问题,将 user.max_user_namespaces=28633
添加到 /etc/sysctl.conf
(或 /etc/sysctl.d
)并运行 sudo sysctl --system
。
[rootlesskit:parent] error: failed to setup UID/GID map: failed to compute uid/gid map: No subuid ranges found for user 1001 ("testuser")
当 /etc/subuid
和 /etc/subgid
未配置时会发生此错误。请参阅 先决条件。
could not get XDG_RUNTIME_DIR
当 $XDG_RUNTIME_DIR
未设置时会发生此错误。
在非 systemd 主机上,您需要创建一个目录并设置路径
$ export XDG_RUNTIME_DIR=$HOME/.docker/xrd
$ rm -rf $XDG_RUNTIME_DIR
$ mkdir -p $XDG_RUNTIME_DIR
$ dockerd-rootless.sh
注意
每次注销时都必须删除该目录。
在 systemd 主机上,使用 pam_systemd
登录主机(见下文)。该值会自动设置为 /run/user/$UID
并在每次注销时清理。
systemctl --user
失败并显示 "Failed to connect to bus: No such file or directory"
此错误通常发生在您使用 sudo
从 root 用户切换到非 root 用户时
# sudo -iu testuser
$ systemctl --user start docker
Failed to connect to bus: No such file or directory
您需要使用 pam_systemd
登录,而不是使用 sudo -iu <USERNAME>
。例如
- 通过图形控制台登录
ssh <USERNAME>@localhost
machinectl shell <USERNAME>@
守护进程不会自动启动
您需要运行 sudo loginctl enable-linger $(whoami)
以启用守护进程自动启动。请参阅 用法。
iptables failed: iptables -t nat -N DOCKER: Fatal: can't open lock file /run/xtables.lock: Permission denied
当主机上启用了 SELinux 时,使用旧版本的 Docker 可能会发生此错误。
此问题已在 Docker 20.10.8 中修复。对于旧版本的 Docker,一个已知的解决方法是运行以下命令禁用 iptables
的 SELinux
$ sudo dnf install -y policycoreutils-python-utils && sudo semanage permissive -a iptables_t
docker pull
错误
docker: failed to register layer: Error processing tar file(exit status 1): lchown <FILE>: invalid argument
当 /etc/subuid
或 /etc/subgid
中可用条目数量不足时会发生此错误。所需条目数量因镜像而异。然而,65,536 个条目对于大多数镜像来说是足够的。请参阅 先决条件。
docker: failed to register layer: ApplyLayer exit status 1 stdout: stderr: lchown <FILE>: operation not permitted
此错误通常发生在 ~/.local/share/docker
位于 NFS 上时。
一个解决方法是在 ~/.config/docker/daemon.json
中指定一个非 NFS 的 data-root
目录,如下所示
{"data-root":"/somewhere-out-of-nfs"}
docker run
错误
docker: Error response from daemon: OCI runtime create failed: ...: read unix @->/run/systemd/private: read: connection reset by peer: unknown.
此错误通常发生在 cgroup v2 主机上,大部分是由于用户的 dbus 守护进程未运行。
$ systemctl --user is-active dbus
inactive
$ docker run hello-world
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:385: applying cgroup configuration for process caused: error while starting unit "docker
-931c15729b5a968ce803784d04c7421f791d87e5ca1891f34387bb9f694c488e.scope" with properties [{Name:Description Value:"libcontainer container 931c15729b5a968ce803784d04c7421f791d87e5ca1891f34387bb9f694c488e"} {Name:Slice Value:"use
r.slice"} {Name:PIDs Value:@au [4529]} {Name:Delegate Value:true} {Name:MemoryAccounting Value:true} {Name:CPUAccounting Value:true} {Name:IOAccounting Value:true} {Name:TasksAccounting Value:true} {Name:DefaultDependencies Val
ue:false}]: read unix @->/run/systemd/private: read: connection reset by peer: unknown.
要解决此问题,运行 sudo apt-get install -y dbus-user-session
或 sudo dnf install -y dbus-daemon
,然后重新登录。
如果错误仍然存在,尝试运行 systemctl --user enable --now dbus
(不带 sudo)。
--cpus
、--memory
和 --pids-limit
被忽略
在 cgroup v1 模式下,这是预期行为。要使用这些标志,需要将主机配置为启用 cgroup v2。更多信息,请参阅 资源限制。
网络错误
本节提供了无根模式下网络故障排除的技巧。
无根模式下的网络通过 RootlessKit 中的网络驱动程序和端口驱动程序支持。网络性能和特性取决于您使用的网络和端口驱动程序的组合。如果您遇到与网络相关的意外行为或性能问题,请查看下表,其中显示了 RootlessKit 支持的配置及其比较
网络驱动程序 | 端口驱动程序 | 网络吞吐量 | 端口吞吐量 | 源 IP 传播 | 无 SUID | 注意 |
---|---|---|---|---|---|---|
slirp4netns | builtin | 慢 | 快 ✅ | ❌ | ✅ | 典型设置下的默认项 |
vpnkit | builtin | 慢 | 快 ✅ | ❌ | ✅ | 当 slirp4netns 未安装时的默认项 |
slirp4netns | slirp4netns | 慢 | 慢 | ✅ | ✅ | |
pasta | implicit | 慢 | 快 ✅ | ✅ | ✅ | 实验性;需要 pasta 2023_12_04 或更高版本 |
lxc-user-nic | builtin | 快 ✅ | 快 ✅ | ❌ | ❌ | 实验性 |
bypass4netns | bypass4netns | 快 ✅ | 快 ✅ | ✅ | ✅ | 注意: 未集成到 RootlessKit 中,因为它需要自定义 seccomp 配置文件 |
有关特定网络问题的故障排除信息,请参阅
docker run -p
失败,并显示cannot expose privileged port
- Ping 不工作
docker inspect
中显示的IPAddress
不可访问--net=host
不监听主机网络命名空间上的端口- 网络速度慢
docker run -p
不传播源 IP 地址
docker run -p
失败,并显示 cannot expose privileged port
当指定特权端口(< 1024)作为主机端口时,docker run -p
会失败并显示此错误。
$ docker run -p 80:80 nginx:alpine
docker: Error response from daemon: driver failed programming external connectivity on endpoint focused_swanson (9e2e139a9d8fc92b37c36edfa6214a6e986fa2028c0cc359812f685173fa6df7): Error starting userland proxy: error while calling PortManager.AddPort(): cannot expose privileged port 80, you might need to add "net.ipv4.ip_unprivileged_port_start=0" (currently 1024) to /etc/sysctl.conf, or set CAP_NET_BIND_SERVICE on rootlesskit binary, or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied.
当遇到此错误时,考虑使用非特权端口代替。例如,使用 8080 而不是 80。
$ docker run -p 8080:80 nginx:alpine
要允许暴露特权端口,请参阅 暴露特权端口。
Ping 不工作
当 /proc/sys/net/ipv4/ping_group_range
设置为 1 0
时,Ping 不工作
$ cat /proc/sys/net/ipv4/ping_group_range
1 0
详情请参阅 路由 Ping 数据包。
docker inspect
中显示的 IPAddress
不可访问
这是预期行为,因为守护进程位于 RootlessKit 的网络命名空间内部。请改用 docker run -p
。
--net=host
不监听主机网络命名空间上的端口
这是预期行为,因为守护进程位于 RootlessKit 的网络命名空间内部。请改用 docker run -p
。
网络速度慢
如果安装了 slirp4netns v0.4.0 或更高版本,无根模式下的 Docker 将使用 slirp4netns 作为默认网络堆栈。如果未安装 slirp4netns,Docker 将回退到 VPNKit。安装 slirp4netns 可以提高网络吞吐量。
有关 RootlessKit 网络驱动程序的更多信息,请参阅 RootlessKit 文档。
此外,更改 MTU 值也可以提高吞吐量。可以通过创建 ~/.config/systemd/user/docker.service.d/override.conf
并包含以下内容来指定 MTU 值
[Service]
Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_MTU=<INTEGER>"
然后重启守护进程
$ systemctl --user daemon-reload
$ systemctl --user restart docker
docker run -p
不传播源 IP 地址
这是因为无根模式下的 Docker 默认使用 RootlessKit 的 builtin
端口驱动程序,该驱动程序不支持源 IP 传播。要启用源 IP 传播,您可以
- 使用
slirp4netns
RootlessKit 端口驱动程序 - 使用
pasta
RootlessKit 网络驱动程序,搭配implicit
端口驱动程序
pasta
网络驱动程序是实验性的,但与 slirp4netns
端口驱动程序相比,它提供了改进的吞吐量性能。pasta
驱动程序需要 Docker Engine 25.0 或更高版本。
更改 RootlessKit 网络配置
在
~/.config/systemd/user/docker.service.d/override.conf
创建一个文件。根据您想要使用的配置,添加以下内容
slirp4netns
[Service] Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_NET=slirp4netns" Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=slirp4netns"
pasta
网络驱动程序搭配implicit
端口驱动程序[Service] Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_NET=pasta" Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_PORT_DRIVER=implicit"
重启守护进程
$ systemctl --user daemon-reload $ systemctl --user restart docker
有关 RootlessKit 网络选项的更多信息,请参阅
调试技巧
进入 dockerd
命名空间
dockerd-rootless.sh
脚本在其自己的用户、挂载和网络命名空间中执行 dockerd
。
为了调试,您可以运行 nsenter -U --preserve-credentials -n -m -t $(cat $XDG_RUNTIME_DIR/docker.pid)
进入这些命名空间。