14
0

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

2026-07-17
2026-07-18
Rootless Docker on WSL (for hermes user) 完整安装流程

为什么需要 Rootless Docker?

Docker 服务(dockerd)在运行时会开放一个叫 /var/run/docker.sock 的套接字文件,这个文件默认只允许 root 和 docker 组 的用户访问。如果通过有 sudo 权限的普通用户使用 sudo 命令安装的 docker,该用户是不在 docker 组里的,使用 docker info 等命令会 permission denied (必须在前面加上 sudo )。

之前的博客是用 sudo usermod -aG docker hermes 命令将 hermes 用户加入到 docker 组,后面我学习了一下,把用户加入 docker 组,就等于允许该用户绕开 sudo,直接通过 .sock 文件与 Docker 守护进程交互。这就意味着,组内的任何用户都拥有等同于 root 的操作权限。 对于我的 hermes 用户来说,我肯定是不希望它有 sudo 权限的,所以本次改用 Rootless docker 。

前置条件:

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

第四步:设置环境变量

告诉终端如何找到 Rootless Docker 路径和套接字。直接执行以下命令将其写入 ~/.bashrc(使用 $(id -u) 动态获取 UID,彻底杜绝权限报错):

cat << 'EOF' >> ~/.bashrc

# Rootless Docker Variables
export PATH=/home/hermes/bin:$PATH
export XDG_RUNTIME_DIR=/run/user/$(id -u) # 如果在前置条件中执行过此命令可以不执行
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
EOF

source ~/.bashrc

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

注意,阿里源现在不再提供统一的公共加速地址了,而是给每个账号分配一个专属的、带鉴权的私有加速链接,且仅给阿里云产品进行加速。 这里提供几个常见源。

mkdir -p ~/.config/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

第三步执行安装脚本时,不仅装好了软件,还在流程的最后把 Docker 后台服务给启动了。

这就导致在这里创建 daemon.json 时,面对的是一个已经跑起来的 Docker 进程。所以我们需要让它重启并重新读取刚刚写好的配置文件。直接在终端执行:

systemctl --user restart docker

现在再跑一次体检命令:

docker info | grep -A 4 "Registry Mirrors"

这下就能看到我们配的镜像了。

如果这些镜像不好用的话,可以让docker直接走代理。注意,这一步需要你给环境配置了代理!

# 1. 创建专门存放扩展配置的文件夹(官方推荐做法)
mkdir -p ~/.config/systemd/user/docker.service.d

# 2. 写入独立的代理补丁文件
cat > ~/.config/systemd/user/docker.service.d/http-proxy.conf <<-'EOF'
[Service]
Environment="HTTP_PROXY=你的代理地址"
Environment="HTTPS_PROXY=你的代理地址"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
EOF

# 3. 嫌镜像碍手可以彻底删除镜像源配置(可选)
rm ~/.config/docker/daemon.json

# 4. 让系统管家重新加载配置,并重启 Docker
systemctl --user daemon-reload
systemctl --user restart docker

第六步:测试验证

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)

✅ 环境确认

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

评论