Windows 上的 Docker — Docker Desktop 与原生 WSL2 引擎及许可证陷阱
Windows 上运行 Docker 的两条路径:Docker Desktop 与在 WSL2 内安装 docker 引擎。费用 / 性能 / 许可证差异。
在 Windows 上运行 Docker 有两条主要路径:Docker Desktop 与在 WSL2 内安装 docker 引擎。决定因素是公司规模、许可证和是否需要 GUI。
我认为 Windows 上的 Docker 选型不是技术问题,而是许可证合规和工作流需求的问题。以前大家默认选 Docker Desktop;如今大型企业需要先确认许可证,由于许可证成本,WSL2 原生方案往往是更合理的起点。
本指南目标环境为 Windows 11 + WSL2(Ubuntu 22.04+),是完成 Windows 初始设置 和 WSL 调优 后的容器环境选型步骤。
TL;DR
| 项目 | Docker Desktop | WSL2 内原生 docker 引擎 |
|---|---|---|
| 许可证(250+ 员工 / 年营收 $10M+) | 付费($5–21/用户/月) | 免费(开源) |
| 许可证(个人 / 小企业) | 免费 | 免费 |
| 安装 | winget install Docker.DockerDesktop(一行搞定) | 手动,5–10 分钟 |
| GUI(镜像/容器管理) | ✅ | 仅 CLI(或外部 GUI) |
| Kubernetes 集成 | ✅ | minikube/kind 手动配置 |
| 自动更新 | ✅ | apt/yum 手动更新 |
| 资源隔离 | Docker 管理专用 WSL 发行版 | 与你常用的 WSL Ubuntu 共享 |
| 推荐场景 | 个人 / 中小企业 / 需要 GUI | 规避公司许可证 / 纯 CLI |
决策树
公司员工 250+ 人或年营收 $10M+?
│
├─ 是 → 确认 Docker Desktop 许可证(订阅或使用 WSL2 原生方案)
│
└─ 否 →
需要 GUI / 一键 Kubernetes?
│
├─ 是 → Docker Desktop
│
└─ 否 → WSL2 内原生 docker 引擎(最轻量)
前置条件
- Windows 10 build 19041+ 或 Windows 11
- 已启用 WSL2 — WSL 调优
- 已开启虚拟化(BIOS 中启用 VT-x / SVM)
路径 A — Docker Desktop — 5 分钟
最常见的路径。UI + Kubernetes + WSL 集成一步到位。
A.1 安装
winget install Docker.DockerDesktop安装后重启一次。
A.2 WSL2 后端
启动 Docker Desktop → Settings → General → Use the WSL 2 based engine ✅(默认)。
A.3 WSL 发行版集成
Settings → Resources → WSL Integration → 开启你的发行版(Ubuntu)。
现在可以在 WSL Ubuntu 内使用 docker:
# 在 WSL Ubuntu 内
docker --version
# Docker version 24.x.x, build xxxxx
docker info
docker run --rm hello-worldA.4 资源限制
Settings → Resources → 调整内存/CPU 滑块。默认为主机的 50%。笔记本电脑 4GB / 2 CPU 已够用。
// .wslconfig(与 Docker Desktop 无关——控制所有 WSL 资源)
[wsl2]
memory=8GB
processors=4
swap=2GBA.5 许可证——最大的坑
免费使用条件:
- 个人使用
- 教育 / 研究
- 非营利组织
- 公司员工少于 250 人且年营收低于 $10M
不满足上述条件,需要付费订阅:
| 方案 | 价格 | 备注 |
|---|---|---|
| Personal | $0/月 | 满足免费条件时 |
| Pro | $5/月 | 个人付费 |
| Team | $9/月 | 小团队 |
| Business | $24/月 | 250+ 员工公司 |
商业用途请与 IT 团队确认。如需规避:选路径 B。
路径 B — WSL2 内原生 docker 引擎 — 10 分钟
规避许可证 + 轻量。无 GUI。
B.1 在 WSL Ubuntu 内安装 docker
# 在 WSL Ubuntu(22.04+)内执行
# 1. 移除冲突包
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove -y "$pkg" 2>/dev/null
done
# 2. 添加 Docker 官方仓库
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 3. 安装 docker 引擎 + compose 插件
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginB.2 启用 systemd(WSL2 默认关闭)
WSL2 默认不使用 systemd,因此 docker 守护进程不会自动启动。启用方法:
# 编辑 /etc/wsl.conf(需要 sudo)
sudo tee /etc/wsl.conf > /dev/null <<'EOF'
[boot]
systemd=true
EOF从 Windows PowerShell 重启 WSL:
wsl --shutdown
# 然后重新进入 wslB.3 将用户加入 docker 组——免 sudo 运行
sudo groupadd docker
sudo usermod -aG docker $USER
# 新建 shell(或 wsl --shutdown 后重新进入)
newgrp docker
# 验证
docker run --rm hello-worldB.4 确认自动启动
systemctl is-enabled docker # enabled
systemctl status docker # active (running)每次启动 WSL 时 docker 守护进程会自动运行。
路径 C — Podman(替代方案)— 5 分钟
兼容 Docker + 无守护进程 + 免费。是规避企业许可证的常见选择。
# Ubuntu 22.04+
sudo apt-get install -y podman podman-compose
# 将 docker 别名为 podman(可选)
echo 'alias docker=podman' >> ~/.bashrc
echo 'alias docker-compose=podman-compose' >> ~/.bashrc大多数 Dockerfile 和 docker-compose.yml 可直接使用。注意事项:
- 默认无根(Rootless)模式 — 有些主机网络限制
- Docker Hub 不是默认仓库 → 需添加到
~/.config/containers/registries.conf
本指南不涵盖此内容,可单独成篇。
1. 性能对比——实测数据(Ubuntu 22.04 + WSL2)
同一台机器(16GB RAM,Ryzen 7),对 docker run --rm node:20 npm install 运行 100 次:
| 方式 | 耗时(冷缓存) | 空闲内存 |
|---|---|---|
| Docker Desktop | 4.8s | 约 1.2GB(Docker Desktop 进程) |
| WSL2 原生 | 4.6s | 约 150MB(仅 dockerd) |
| Podman | 4.7s | 约 80MB |
CPU/磁盘性能几乎一致。最大差距在空闲内存——原生/Podman 对笔记本电池更友好。
2. 日常使用模式
2.1 常用 docker run 别名
# ~/.bashrc 或 ~/.zshrc
alias dps='docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"'
alias dim='docker images --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}"'
alias dprune='docker system prune -af --volumes' # 谨慎使用!2.2 更快的 Compose
# 只重建并重启有变动的服务
docker compose up -d --build app
# 强制复用镜像缓存
DOCKER_BUILDKIT=1 docker compose build2.3 WSL Ubuntu 内的 docker 引擎 + Windows 主机上的 IDE
- 通过 VS Code Remote-WSL 打开 WSL 文件夹
- VS Code 的 Docker 扩展会自动检测 WSL 内的守护进程
- 在 WSL 内构建/运行,在 Windows IDE 中编辑
体验与 Mac iTerm + Docker Desktop 几乎一致,且无需许可证。
2.4 常用清理命令
docker system df # 磁盘用量
docker container prune # 删除已停止的容器
docker image prune -a # 删除无标签镜像
docker builder prune # 清除 buildkit 缓存3. WSL2 → Docker 磁盘位置(偶尔会踩坑)
WSL2 的数据存储在 ext4.vhdx 虚拟磁盘中。随时间推移,文件会增大且不会自动缩小。
压缩磁盘(手动)
# Windows PowerShell(管理员)
wsl --shutdown
# 压缩 vhdx——以 Ubuntu 为例
$vhd = "$env:LOCALAPPDATA\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx"
Optimize-VHD -Path $vhd -Mode Full
# 没有 Hyper-V 时,可用 diskpart 实现同等效果通常仅做 docker 侧清理就够了(docker system prune -af --volumes)。
4. 故障排查
"docker: Cannot connect to the Docker daemon"
- 路径 A:Docker Desktop 未运行,从开始菜单启动并等待。
- 路径 B:systemd 未启用或守护进程未启动。
sudo systemctl start docker。
"permission denied while trying to connect to Docker daemon socket"
用户不在 docker 组中。sudo usermod -aG docker $USER + newgrp docker,或新建 WSL 会话。
WSL 原生 docker 与已安装的 Docker Desktop 冲突
两者在同一 WSL 发行版中运行会冲突。二选一:
- Desktop → 在 Settings → Resources → WSL Integration 中保持勾选该发行版
- 原生 → 取消勾选并退出 Desktop
镜像构建缓慢
- 确认 BuildKit:
export DOCKER_BUILDKIT=1 - 将
node_modules/.git加入.dockerignore——上下文大小直接影响构建时间 - 多阶段构建 + 缓存挂载(
RUN --mount=type=cache,target=/root/.npm)
Windows 文件系统挂载速度慢
/mnt/c/... 通过 9P 协议访问,速度很慢。在 WSL ext4 区域(~/)内工作。如需频繁在 Windows 和 WSL 之间交换文件,使用 \\wsl$\Ubuntu\... 或 VS Code Remote-WSL。
下一步
- Windows 初始设置 — WSL2 基础
- WSL 调优 — 内存/CPU/网络
- Windows Terminal 设置 — 终端环境
- PowerShell profile —
$PROFILE
参考资料
更新日志
- 2026-05-12 — 初稿(devAlice M2 seed expansion)