我没有安装 Docker Desktop,而是把 Docker Engine 直接装在 WSL2 的 Ubuntu 中。平时在 PowerShell 输入 docker,命令会转发给 WSL,镜像、容器和 Docker 服务都留在 Ubuntu 里。
2026 年 9 月,我又把 WSL 更新到了预发布版本,开始试用微软内置的 WSL Containers 和 wslc.exe。它与 Ubuntu 中的 Docker Engine 是两条容器使用路径。这篇同时记录两者,但现有项目仍然使用 Docker Engine 和 docker compose,没有因为装上 wslc 就迁移。
这篇只记录 Docker 的安装和使用。发行版安装、导入导出、systemd 与 WSL 配置见 WSL2 优化与管理。
参考文档
- 在 Ubuntu 上安装 Docker Engine
- Docker Engine 安装后的 Linux 配置
- 微软 WSL Containers 入门教程
- WSL Containers 公开预览公告
- SmartScope:WSLc、Docker Engine 与 Compose 的差异
在 Ubuntu 中安装 Docker
我使用 Docker CE 仓库,下载地址换成 USTC 镜像。GPG 公钥仍然从 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://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装 Docker Engine、命令行工具、Buildx 和 Compose 插件:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker我把日常登录用户加入 docker 组,这样执行 Docker 命令时不必反复输入 sudo:
sudo usermod -aG docker $USER
newgrp dockerdocker 组可以直接访问 Docker Socket,权限接近 root,只应加入可信用户。
检查安装结果
我会分别检查 Engine、Compose、Buildx 和服务状态:
docker version
docker compose version
docker buildx version
systemctl status docker如果 docker version 只有 Client,没有 Server,先看 systemctl status docker 的输出。服务没有启动时执行:
sudo systemctl start docker更新到预发布版并启用 wslc
WSL Containers 目前不在 WSL 稳定版中。微软的 WSL Containers 教程要求 WSL 2.9.3 或更高版本,并明确说明当前必须更新到预发布通道:
# 更新到包含 WSL Containers 的预发布版本
wsl --update --pre-release升级完成后检查 WSL 和 wslc:
wsl --version
wslc version
wslc --help我当前的实测结果是:
wslc 2.9.11.0wslc.exe 随 WSL 一起安装,不需要再进入 Ubuntu 安装一套容器引擎。它是 Windows 侧命令,可以直接在 PowerShell 或 Windows Terminal 中调用。微软还提供了 container.exe 别名,两者指向同一个 CLI。
先用官方的 hello-world 验证镜像拉取和容器运行:
wslc run --rm hello-world常用的查看命令如下:
wslc image list
wslc container list
wslc container list --all
wslc stats运行一个临时 Ubuntu 容器:
wslc run --rm -it ubuntu:latest bash运行 Nginx,并把 Windows 的 8080 端口转发到容器的 80:
wslc run -d --rm -p 8080:80 --name web nginx
curl.exe http://localhost:8080
wslc exec web cat /etc/os-release
wslc container stop webwslc 也能从 Dockerfile 或 Containerfile 构建镜像:
wslc build -t my-app .
wslc image list
wslc run --rm my-app现在还不替换 Docker Engine
SmartScope 对 WSL Containers 预览版的分析提出了一个很实际的比较基准:如果原来已经在 WSL2 中稳定运行 Docker Engine,wslc 对个人开发者的直接收益并不大。它的新增价值主要是 Windows 侧 CLI、供 Windows 应用调用的容器 API,以及 GPO、Intune、Registry allowlist 和 Defender 等企业管理入口。
我本机的 wslc 2.9.11.0 帮助列表中没有 compose 命令,微软的公开预览公告也只说明 Compose 是正在研究的需求。因此,现有多容器项目继续使用:
docker compose up -d
docker compose ps
docker compose logs -f单容器测试、新网络模式验证,或者以后需要从 Windows 应用通过 API 管理 Linux 容器时,再单独尝试 wslc。不能因为两套命令都能 build、run,就假定现有 Docker 镜像、容器、网络和 Compose 项目会自动迁移过去。
Windows 应用可以直接调用容器 API
WSL Containers 除了 wslc.exe,还提供 Microsoft.WSL.Containers NuGet 包。微软的公开预览公告列出了 C、C++ 和 C# 接口,并提供 MSBuild、CMake 集成。这个 API 适合 Windows 工具把 Linux 容器的创建、进程执行和生命周期管理嵌入自己的流程;只是在终端里运行项目时,CLI 已经够用。
预览版还引入了 virtiofs、Consomme 和新的内存回收方式。Consomme 对我更直接:开启 Windows TUN 后,WSL 和 Docker 不再出现之前的 Mirrored 网络初始化故障。详细错误和验证放在 WSL2 优化与管理。
在 PowerShell 中直接使用 docker
Docker CLI 安装在 Ubuntu 的 /usr/bin/docker,Windows 侧不再安装一份。我把转发函数放在当前用户的通用 Profile 中:
$PROFILE.CurrentUserAllHostsPowerShell 7 通常会返回 C:\Users\<用户名>\Documents\PowerShell\profile.ps1。在这个文件中加入:
# Docker 别名
function dockerfunction {
wsl docker @Args
}
Set-Alias -Name docker -Value dockerfunction保存后重新打开 PowerShell,或者在当前会话重新加载:
. $PROFILE.CurrentUserAllHosts然后直接验证 Windows 到 WSL 的调用链:
Get-Command docker
docker version
docker compose version这里的 wsl docker @Args 会调用默认 WSL 发行版。我的默认发行版是安装 Docker 的 Ubuntu;如果以后更换默认发行版,这个别名也会跟着调用新的默认发行版。
如果第一次执行 docker 时出现 CreateInstance/CreateVm/ConfigureNetworking/0x8007054f,并提示 networkingMode Mirrored 回退到 None,问题发生在 WSL 创建网络的阶段,不是 Docker 镜像或 Compose 配置。那次故障的完整排查、只能重启 Windows 的恢复过程,以及后来改用 Consomme 后开启 TUN 仍能正常工作的结果,记录在 WSL2 优化与管理。
常用命令
我使用 Compose 时常用下面几条:
docker compose up -d
docker compose ps
docker compose logs -f
docker compose pull
docker compose downdocker compose down 不会删除命名卷;带上 -v 才会删卷。数据库数据放在卷里时,我不会随手加 -v。
查看当前容器和 Docker 占用空间:
docker ps --all
docker system dfDocker 的镜像和卷最终都会写入 WSL 的 VHDX。删除镜像后,Windows 上的 VHDX 文件不一定自动缩小,具体处理见 WSL2 的 VHDX 为什么只增不减。