Docker Desktop 不是“连接”Ubuntu子系统,而是通过WSL2集成机制将引擎运行在WSL2虚拟机中,并让Ubuntu共享同一dockerd进程;WSL Ubuntu默认无CLI,需启用WSL Integration开关才能自动注入docker/docker-compose命令及配置DOCKER_HOST。

直接说结论:Docker Desktop 不是“连接”Ubuntu子系统,而是通过 WSL2 集成机制,把 Docker 引擎运行在 WSL2 虚拟机里,并让 Ubuntu 发行版共享同一个引擎进程。你不需要在 Ubuntu 里再装 docker 或 docker-compose,否则反而会冲突。
为什么在 WSL Ubuntu 里执行 docker 命令却提示 command not found
这是最常被误解的点:WSL2 Ubuntu 默认不自带 Docker CLI,它也不该自带——Docker Desktop 已经在宿主 Windows 的 WSL2 环境中部署好了服务端(dockerd),但 CLI(docker 命令)需要手动注入或启用集成。
- 如果你之前在 Ubuntu 里用
apt install docker.io装过旧版 Docker,必须先卸载:sudo apt remove docker.io docker-compose,否则会和 Docker Desktop 的dockerd抢端口、冲突 socket - Docker Desktop 安装后,CLI 可执行文件默认放在 Windows 的
C:\Program Files\Docker\Docker\resources\bin\下,它不会自动加到 WSL 的$PATH - 真正起作用的是 Docker Desktop 的 “WSL Integration” 开关——它会在启用时,自动把 Windows 下的
docker和docker-compose(v2)软链接到/usr/bin/,并配置好DOCKER_HOST环境变量指向 WSL2 内部的 Unix socket
启用 WSL Integration 的关键步骤和易错点
这一步看似简单,但漏掉任一条件都会导致 docker 在 Ubuntu 终端里不可用。
- 确保 WSL2 已是默认版本:
wsl --set-default-version 2;运行wsl -l -v确认你的 Ubuntu 显示为2(不是1) - Docker Desktop 安装时必须勾选 “Use the WSL 2 based engine”(安装向导里有,不是设置页)
- 启动 Docker Desktop 后,进 Settings → Resources → WSL Integration → 勾选 “Enable integration with my default WSL distro”,再单独打开你那个 Ubuntu 发行版的开关(比如
Ubuntu-22.04)→ 点击Apply & Restart - 重启后,在 Ubuntu 终端里执行
which docker,应返回/usr/bin/docker;执行docker version应同时显示 client 和 server 信息,server 的Platform是linux,OS/Arch是linux/amd64(或 arm64) - 如果仍报错
Cannot connect to the Docker daemon,检查echo $DOCKER_HOST是否为空——正常应为unix:///var/run/docker.sock;若为空,说明集成未生效,重开 Docker Desktop 设置页再点一次 Apply
docker-compose 在 WSL Ubuntu 中为什么能直接用
从 Docker Desktop 4.14+ 开始,docker-compose 已作为 docker compose(v2)内置命令提供,不再需要单独安装 Python 版 docker-compose。WSL Integration 开启后,它会自动暴露为 /usr/bin/docker-compose 符号链接,实际调用的是 docker compose 子命令。
- 验证方式:
docker-compose --version应输出类似Docker Compose version v2.24.7 - 不要运行
pip install docker-compose或sudo apt install docker-compose—— 这些会覆盖符号链接,导致命令失效或版本错乱 - 如果项目里用了
docker-compose.yml,可直接运行docker-compose up;新写法推荐统一用docker compose up(少个横线),两者目前等价 - 注意:WSL Ubuntu 里的
docker-compose本质是 Windows 上 Docker Desktop 的一部分,所有镜像、构建缓存、网络都与 Windows 端完全共享,不是独立实例
常见故障:容器能跑,但 localhost:8080 在 Windows 浏览器打不开
这不是 Docker Desktop 或集成问题,而是 WSL2 网络模型导致的典型现象:WSL2 使用虚拟网卡(如 172.x.x.x),和 Windows 主机不在同一 IP 段,localhost 在 WSL 里指向的是 WSL 自身,不是 Windows。
- 启动容器时必须显式绑定到
0.0.0.0,例如:docker run -p 0.0.0.0:8080:80 nginx;只写-p 8080:80默认绑定127.0.0.1,仅限 WSL 内部访问 - Windows 浏览器访问
http://localhost:8080是有效的——Docker Desktop 会自动把 WSL2 的端口转发到 Windows 的localhost,前提是容器监听的是0.0.0.0 - 如果仍不通,检查 Windows 防火墙是否阻止了入站连接(尤其是“专用网络”配置文件);临时关闭防火墙测试一次即可确认
- 不要尝试在 WSL Ubuntu 里改
/etc/hosts或配 NAT——徒劳且破坏 WSL2 的设计逻辑
最关键的细节往往藏在“启用集成”之后那一次 Apply & Restart:它不只是刷新设置,而是触发 Docker Desktop 重新生成 WSL2 内的符号链接、重置 socket 权限、并注入环境变量。很多人点了开关却没点 Apply,或者点了 Apply 但没等右下角提示“Restarting…”完成就去终端敲命令,结果自然失败。


















