无根模式
无根模式允许以非 root 身份运行 Docker 守护进程和容器 user 来缓解守护进程中的潜在漏洞,以及 容器运行时。
无根模式即使在安装 Docker 守护程序,只要满足先决条件即可。
运作方式
无根模式在用户命名空间内执行 Docker 守护进程和容器。
这与userns-remap
模式,除了
跟userns-remap
模式中,守护进程本身以 root 权限运行,
而在无根模式下,守护进程和容器都在运行
root 权限。
无根模式不使用具有SETUID
位或文件功能,
除了newuidmap
和newgidmap
,需要这些 API 才能允许多个
要在用户命名空间中使用的 UID/GID。
先决条件
您必须安装
newuidmap
和newgidmap
在主机上。这些命令 由uidmap
package 的 Package。/etc/subuid
和/etc/subgid
应至少包含 65,536 个 subordinate 用户的 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
.如果在用户未直接登录的终端中运行,则需要安装
systemd-container
跟sudo apt-get install -y systemd-container
,然后使用命令sudo machinectl shell TheUser@
.overlay2
默认情况下启用 Storage Driver (特定于 Ubuntu 的内核补丁)。Ubuntu 24.04 及更高版本通过以下方式启用受限制的非特权用户命名空间 default,可防止非特权进程创建用户命名空间 除非 AppArmor 配置文件配置为允许程序使用 非特权用户命名空间。
如果安装
docker-ce-rootless-extras
使用 deb 包 (apt-get install docker-ce-rootless-extras
),然后是rootlesskit
已与apparmor
deb 包。有了这个 安装方法,无需添加任何手册 AppArmor 配置。如果您使用安装来安装无根 extras 脚本,则必须添加 AppArmor 配置文件rootlesskit
手动地:创建并安装当前登录用户的 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 10,请添加
kernel.unprivileged_userns_clone=1
自/etc/sysctl.conf
(或/etc/sysctl.d
) 并运行sudo sysctl --system
.Debian 11 不需要此步骤。对于 Debian 11,安装
fuse-overlayfs
推荐。跑sudo apt-get install -y fuse-overlayfs
. Debian 12 不需要此步骤。无根 docker 需要
slirp4netns
大于v0.4.0
(当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 应用程序
- 检查站
- 叠加网络
- 公开 SCTP 端口
- 要使用
ping
命令,请参阅 路由 ping 数据包。 - 要公开特权 TCP/UDP 端口 (< 1024),请参阅公开特权端口。
IPAddress
显示于docker inspect
的命名空间位于 RootlessKit 的网络命名空间内。 这意味着 IP 地址无法从主机访问nsenter
-ing 添加到 network 命名空间中。- 主机网络 (
docker run --net=host
) 也位于 RootlessKit 中的命名空间中。 - 不支持将 NFS 挂载为 docker “data-root”。此限制并非特定于 rootless 模式。
安装
注意
如果系统范围的 Docker 守护进程已在运行,请考虑禁用它:
$ sudo systemctl disable --now docker.service docker.socket $ sudo rm /var/run/docker.sock
如果您选择不关闭
docker
service 和 socket 中,您需要使用--force
parameter 的 API 值。没有已知问题,但在您关闭并禁用之前,您是 仍在运行有根的 Docker。
如果您使用 RPM/DEB 软件包安装了 Docker 20.10 或更高版本,您应该具有dockerd-rootless-setuptool.sh
在/usr/bin
.
跑dockerd-rootless-setuptool.sh install
作为非 root 用户来设置守护进程:
$ 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 上提供的安装脚本。
由于 static 软件包不适用于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
Binaries将安装在~/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
.
要删除Binaries,请删除docker-ce-rootless-extras
package(如果您使用包管理器安装了 Docker)。
如果您使用 https://get.docker.com/rootless 安装了 Docker( Install without packages),
删除~/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 服务并持续:
$ systemctl --user enable docker
$ sudo loginctl enable-linger $(whoami)
将无根 Docker 作为 systemd 范围的服务 (/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
. - data dir 设置为
~/.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
要使用 CLI 上下文docker context
:
$ docker context use rootless
rootless
Current context is now "rootless"
$ docker run -d -p 8080:80 nginx
最佳实践
Docker 中的无根 Docker
要在 “rootful” Docker 中运行无根 Docker,请使用docker:<version>-dind-rootless
image 而不是docker:<version>-dind
.
$ docker run -d --name dind-rootless --privileged docker:25.0-dind-rootless
这docker:<version>-dind-rootless
image 以非 root 用户 (UID 1000) 身份运行。
然而--privileged
是禁用 seccomp、AppArmor 和 mount 所必需的
面具。
通过 TCP 暴露 Docker API 套接字
要通过 TCP 公开 Docker API 套接字,您需要启动dockerd-rootless.sh
跟DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="-p 0.0.0.0:2376:2376/tcp"
.
$ 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),请将CAP_NET_BIND_SERVICE
upperrootlesskit
binary 并重新启动守护程序。
$ 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 相关的docker run
标志,例如--cpus
,--memory
,--pids-limit
仅在使用 cgroup v2 和 systemd 运行时受支持。
请参阅更改 cgroup 版本以启用 cgroup v2。
如果docker info
显示none
如Cgroup Driver
,则不满足条件。
当这些条件不满足时,无根模式会忽略与 cgroup 相关的docker run
标志。
有关解决方法,请参阅在没有 cgroup 的情况下限制资源。
如果docker info
显示systemd
如Cgroup Driver
,则满足条件。
但是,通常只有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:
...
rootlesskit
如果您通过sudo su
.对于无法登录的用户,您必须使用machinectl
命令,它是systemd-container
包。安装后systemd-container
切换到myuser
使用以下命令:
$ sudo machinectl shell myuser@
哪里myuser@
是您想要的用户名,@ 表示此计算机。
启动 Docker 守护程序时出错
[rootlesskit:parent] 错误:无法启动子项:fork/exec /proc/self/exe:不允许作
此错误主要发生在/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] 错误:无法启动子项:fork/exec /proc/self/exe:设备上没有剩余空间
此错误主要发生在/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] 错误:无法设置 UID/GID 映射:无法计算 uid/gid 映射:未找到用户 1001 (“testuser”) 的 subuid 范围
此错误发生在/etc/subuid
和/etc/subgid
未配置。请参阅先决条件。
无法获取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
:
# sudo -iu testuser
$ systemctl --user start docker
Failed to connect to bus: No such file or directory
而不是sudo -iu <USERNAME>
,您需要使用pam_systemd
.例如:
- 通过 Graphic Console 登录
ssh <USERNAME>@localhost
machinectl shell <USERNAME>@
守护程序未自动启动
你需要sudo loginctl enable-linger $(whoami)
使守护程序能够启动
自动启动。请参阅用法。
iptables 失败:iptables -t nat -N DOCKER:致命:无法打开锁定文件 /run/xtables.lock:权限被拒绝
在主机上启用 SELinux 时,旧版本的 Docker 可能会发生此错误。
此问题已在 Docker 20.10.8 中修复。
旧版本 Docker 的已知解决方法是运行以下命令来禁用 SELinuxiptables
:
$ sudo dnf install -y policycoreutils-python-utils && sudo semanage permissive -a iptables_t
docker pull
错误
docker: 注册层失败: 处理 tar 文件时出错(退出状态 1): lchown <FILE>: 参数无效
当/etc/subuid
或/etc/subgid
是不够的。所需的条目数因而异
镜像。但是,对于大多数镜像,65,536 个条目就足够了。请参阅先决条件。
docker: 注册层失败: ApplyLayer 退出状态 1 stdout: stderr: lchown <FILE>: 不允许作
此错误主要在以下情况下发生~/.local/share/docker
位于 NFS 上。
解决方法是指定非 NFSdata-root
目录中的~/.config/docker/daemon.json
如下:
{"data-root":"/somewhere-out-of-nfs"}
docker run
错误
docker:来自守护程序的错误响应:OCI 运行时创建失败:...:读取 unix @->/run/systemd/private:读取:对等连接重置:未知。
此错误主要发生在 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 的 Rootless Kit 中。网络性能和特性取决于组合 使用网络和端口驱动程序。如果您遇到意外行为 或与网络相关的性能,请查看下表,其中显示了 RootlessKit 支持的配置,以及它们的比较:
网络驱动程序 | 端口驱动程序 | 净吞吐量 | 端口吞吐量 | 源 IP 传播 | 无 SUID | 注意 |
---|---|---|---|---|---|---|
slirp4netns | builtin | 慢 | 快 ✅ | ❌ | ✅ | 典型设置中的默认值 |
vpnkit | builtin | 慢 | 快 ✅ | ❌ | ✅ | 默认slirp4netns 未安装 |
slirp4netns | slirp4netns | 慢 | 慢 | ✅ | ✅ | |
pasta | implicit | 慢 | 快 ✅ | ✅ | ✅ | 实验的;需要意大利面版本 2023_12_04 或更高版本 |
lxc-user-nic | builtin | 快 ✅ | 快 ✅ | ❌ | ❌ | 实验的 |
bypass4netns | bypass4netns | 快 ✅ | 快 ✅ | ✅ | ✅ | 注意:未集成到 RootlessKit,因为它需要自定义 seccomp 配置文件 |
有关排查特定网络问题的信息,请参阅:
docker run -p
失败cannot expose privileged port
- Ping 不起作用
IPAddress
显示于docker inspect
无法访问--net=host
不侦听主机网络命名空间上的端口- 网络速度慢
docker run -p
不传播源 IP 地址
docker run -p
失败cannot expose privileged port
docker run -p
将特权端口 (< 1024) 指定为主机端口时,失败并显示此错误。
$ 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 不起作用
Ping 在以下情况下不起作用/proc/sys/net/ipv4/ping_group_range
设置为1 0
:
$ cat /proc/sys/net/ipv4/ping_group_range
1 0
有关详细信息,请参阅路由 ping 数据包。
IPAddress
显示于docker inspect
无法访问
这是预期行为,因为守护进程位于 RootlessKit 的
network 命名空间。用docker run -p
相反。
--net=host
不侦听主机网络命名空间上的端口
这是预期行为,因为守护进程位于 RootlessKit 的
network 命名空间。用docker run -p
相反。
网络速度慢
如果安装了 slirp4netns v0.4.0 或更高版本,则无根模式的 Docker 使用 slirp4netns 作为默认网络堆栈。 如果未安装 slirp4netns,Docker 将回退到 VPNKit。 安装 slirp4netns 可以提高网络吞吐量。
有关 RootlessKit 网络驱动程序的更多信息,请参阅 RootlessKit 文档。
此外,更改 MTU 值可能会提高吞吐量。
可以通过创建~/.config/systemd/user/docker.service.d/override.conf
包含以下内容:
[Service]
Environment="DOCKERD_ROOTLESS_ROOTLESSKIT_MTU=INTEGER"
然后重新启动守护进程:
$ systemctl --user daemon-reload
$ systemctl --user restart docker
docker run -p
不传播源 IP 地址
这是因为无根模式下的 Docker 使用 RootlessKit 的builtin
港口
driver,它不支持源 IP 传播。要启用
源 IP 传播,您可以:
- 使用
slirp4netns
RootlessKit 端口驱动程序 - 使用
pasta
RootlessKit 网络驱动程序,使用implicit
端口驱动程序
这pasta
网络驱动程序是实验性的,但提供了更高的吞吐量
性能与slirp4netns
port 驱动程序。这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
在其自己的 user、mount 和 network 命名空间中。
对于调试,您可以通过运行nsenter -U --preserve-credentials -n -m -t $(cat $XDG_RUNTIME_DIR/docker.pid)
.