WSL与Docker管理

太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处

我没有安装 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

我使用 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 docker

docker 组可以直接访问 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.0

wslc.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 web

wslc 也能从 DockerfileContainerfile 构建镜像:

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。不能因为两套命令都能 buildrun,就假定现有 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.CurrentUserAllHosts

PowerShell 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 down

docker compose down 不会删除命名卷;带上 -v 才会删卷。数据库数据放在卷里时,我不会随手加 -v

查看当前容器和 Docker 占用空间:

docker ps --all
docker system df

Docker 的镜像和卷最终都会写入 WSL 的 VHDX。删除镜像后,Windows 上的 VHDX 文件不一定自动缩小,具体处理见 WSL2 的 VHDX 为什么只增不减