在 WSL2 里手动安装 Docker Engine 时遇坑:systemctl 和 service 命令在默认的 WSL2 Ubuntu 中 无法使用,因为 WSL2 没有 systemd。怎么办?
自己操作让 Docker Engine(dockerd)直接跑起来,挂到/var/run/docker.sock
,而不是依赖systemctl
!
🛠️ 目标
在 WSL2 Ubuntu 20.04 中:
- 自己起
dockerd
; - 生成
/var/run/docker.sock
; - 直接能用
docker
命令连接。
🧩 操作步骤
第一步:确认你已经安装好 docker-ce
如果没装的话,先按官方步骤或者快速装好:
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
第二步:启动 dockerd
手动服务(重点)
直接在 WSL2 里执行:
sudo dockerd --host unix:///var/run/docker.sock
解释一下:
dockerd
是 Docker daemon,就是服务端;--host unix:///var/run/docker.sock
表示:- 监听一个 UNIX Socket(本地文件)作为通信接口;
- 这个 socket 文件就是
/var/run/docker.sock
。
如果成功,会看到类似日志:
INFO[2024-04-27T14:00:00.000000000Z] API listen on /var/run/docker.sock
然后你就可以开一个新终端,测试:
docker ps
成功!
第三步(可选):后台运行 dockerd
手动运行是前台阻塞的,如果你想后台运行:
方案1:加上 &
sudo dockerd --host unix:///var/run/docker.sock &
方案2:用 nohup
保持挂后台
nohup sudo dockerd --host unix:///var/run/docker.sock > /tmp/dockerd.log 2>&1 &
这样即使关闭终端也不掉。
第四步(进阶):自动启动(方便每次开 WSL)
方法1:用户配置文件
如果你懒得每次手动启动,可以在 ~/.bashrc
或 ~/.profile
最后加上:
# 启动 Docker Daemon
if [ ! -S /var/run/docker.sock ]; then
sudo nohup dockerd --host unix:///var/run/docker.sock > /tmp/dockerd.log 2>&1 &
fi
这样每次打开 WSL,都会自动检查 /var/run/docker.sock
是否存在,不存在就自己拉起来。
方法 2:启用 systemd 支持(适合高级用户)
从 WSL 1.0.3 起,微软原生支持 启用 systemd:
-
编辑
/etc/wsl.conf
:sudo nano /etc/wsl.conf
内容如下:
[boot] systemd=true
-
重启 WSL:
wsl --shutdown
-
再打开 Ubuntu,这时可以使用 systemctl 启动服务了:
sudo systemctl enable docker sudo systemctl start docker
但这种方式对 Docker Engine 手动安装用户不总是兼容,不推荐轻度用户使用。
🎯 注意事项
dockerd
必须用 sudo,因为它要创建系统级 socket;- 启动后要保证
/var/run/docker.sock
是 root:docker 权限; - 你的用户如果想免 sudo 用 docker,可以把自己加到
docker
组里:
sudo usermod -aG docker $(whoami)
newgrp docker
然后就可以直接:
docker ps
不需要 sudo。
✅ 小结
步骤 | 说明 |
---|---|
安装好 docker | sudo apt install docker-ce |
手动起 dockerd | sudo dockerd --host unix:///var/run/docker.sock |
新终端用 docker | docker ps |
后台起 / 自动起 | nohup 或 .bashrc |