1
0

Rootless Docker on WSL (for hermes user) 完整安装流程

2026-07-17

前置条件:

1.WSL 已开启 systemd

# 检查 /etc/wsl.conf 是否有 [boot] systemd=true
cat /etc/wsl.conf | grep -A1 "\[boot\]"

如果没有,执行:

sudo vim /etc/wsl.conf

写入:

[boot]
systemd=true

然后在 Windows PowerShell 中执行 wsl --shutdown,重启 WSL。

2.让 hermes 用户成功管理他自己的用户级服务

可以使用 systemctl --user status,如果输出是 Failed to connect to user scope bus via local transport: No such file or directory,则需执行下列步骤。

先确保它驻留后台:

sudo loginctl enable-linger hermes

然后进入到 hermes 用户,写入它的 ~/.bashrc 尾部,直接执行下述命令:

echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> ~/.bashrc
source ~/.bashrc

再使用 systemctl --user status 验证,应该就能看到 Staterunning 了。

第一步:安装依赖

sudo apt update
sudo apt install -y uidmap dbus-user-session

第二步:检查并配置 subordinate IDs(让 hermes 用户可以创建用户命名空间)

确保 /etc/subuid/etc/subgid 文件里有为 hermes 用户分配的 ID 范围。

grep ^hermes: /etc/subuid

应该能看到类似以下的输出:

hermes:165536:65536

如果没输出,需要以 root 身份添加:

sudo usermod --add-subuids 100000-165535 hermes
sudo usermod --add-subgids 100000-165535 hermes

第三步:运行 Rootless Docker 安装脚本

curl -sSL https://get.docker.com/rootless | sh

安装完成后,脚本会自动创建:

  • /home/hermes/bin/dockerd-rootless.sh
  • /home/hermes/.config/systemd/user/docker.service

第四步:配置 systemd 服务(让 Docker daemon 开机自启并走代理)

bash

systemctl --user stop docker
vim ~/.config/systemd/user/docker.service

将整个文件替换为以下内容(三个 Environment 没有的话可以不要):

text

[Unit]
Description=Docker Application Container Engine (Rootless)
After=network.target

[Service]
Type=simple
Environment="HTTP_PROXY=你的代理地址"
Environment="HTTPS_PROXY=你的代理地址"
Environment="NO_PROXY=localhost,127.0.0.1"
ExecStart=/home/hermes/bin/dockerd-rootless.sh
ExecReload=/bin/kill -HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=default.target

保存退出。

bash

systemctl --user daemon-reload
systemctl --user enable docker
systemctl --user start docker

第五步:配置镜像加速器(可选,国内网络加速)

bash

mkdir -p ~/.docker
cat > ~/.docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

重要:镜像加速器需要手动加载,在 service 文件的 ExecStart 中追加:

ExecStart=/home/hermes/bin/dockerd-rootless.sh --config-file /home/hermes/.docker/daemon.json

然后执行 systemctl --user daemon-reload && systemctl --user restart docker

第六步:设置环境变量(让 docker 命令能找到 socket)

echo 'export PATH=/home/hermes/bin:$PATH' >> ~/.bashrc
echo 'export DOCKER_HOST=unix:///run/user/1001/docker.sock' >> ~/.bashrc
echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> ~/.bashrc
source ~/.bashrc

第七步:测试验证

bash

docker info
docker run hello-world

✅ 验证成功的标志

  • docker info 不报错
  • docker run hello-world 能正常拉取并打印欢迎信息

💡 日常使用

操作 命令
启动 Docker systemctl --user start docker
停止 Docker systemctl --user stop docker
查看状态 systemctl --user status docker
查看日志 journalctl --user -u docker -f
运行容器 docker run ...(不需要 sudo)

⚠️ 常见问题

Q: docker runconnection reset by peer
A: 检查代理是否配置在 service 文件的 Environment 中,然后重启 Docker。

Q: 提示 permission denied
A: 确认 DOCKER_HOSTXDG_RUNTIME_DIR 已正确设置,且 hermes 用户对 /run/user/1001 有读写权限。

Q: 镜像拉取慢
A: 检查 ~/.docker/daemon.json 中的镜像加速器是否配置正确,并确认 service 文件中 ExecStart 已追加 --config-file 参数。

✅ 环境确认

  • hermes 用户:无 sudo 权限,不在 docker 组
  • Docker daemon:以 hermes 用户身份运行(Rootless)
  • 代理:自行配置
  • 镜像源:国内镜像加速器

评论