devAlice
← Windows

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 DesktopWSL2 内原生 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-world

A.4 资源限制

Settings → Resources → 调整内存/CPU 滑块。默认为主机的 50%。笔记本电脑 4GB / 2 CPU 已够用。

// .wslconfig(与 Docker Desktop 无关——控制所有 WSL 资源)
[wsl2]
memory=8GB
processors=4
swap=2GB

A.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-plugin

B.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
# 然后重新进入 wsl

B.3 将用户加入 docker 组——免 sudo 运行

sudo groupadd docker
sudo usermod -aG docker $USER
# 新建 shell(或 wsl --shutdown 后重新进入)
newgrp docker
 
# 验证
docker run --rm hello-world

B.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

大多数 Dockerfiledocker-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 Desktop4.8s约 1.2GB(Docker Desktop 进程)
WSL2 原生4.6s约 150MB(仅 dockerd)
Podman4.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 build

2.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。


下一步

参考资料

更新日志

  • 2026-05-12 — 初稿(devAlice M2 seed expansion)