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)
- 代理:自行配置
- 镜像源:国内镜像加速器