Rootless Docker on WSL (for hermes user) 完整安装流程
前置条件:
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 验证,应该就能看到 State 是 running 了。
第一步:安装依赖
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 run 报 connection reset by peer
A: 检查代理是否配置在 service 文件的 Environment 中,然后重启 Docker。
Q: 提示 permission denied
A: 确认 DOCKER_HOST 和 XDG_RUNTIME_DIR 已正确设置,且 hermes 用户对 /run/user/1001 有读写权限。
Q: 镜像拉取慢
A: 检查 ~/.docker/daemon.json 中的镜像加速器是否配置正确,并确认 service 文件中 ExecStart 已追加 --config-file 参数。
✅ 环境确认
- hermes 用户:无 sudo 权限,不在 docker 组
- Docker daemon:以 hermes 用户身份运行(Rootless)
- 代理:自行配置
- 镜像源:国内镜像加速器