我没有安装 Docker Desktop,而是把 Docker Engine 直接装在 WSL2 的 Ubuntu 中。平时在 PowerShell 输入 docker,命令会转发给 WSL,镜像、容器和 Docker 服务都留在 Ubuntu 里。
这篇只记录 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 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在 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;如果以后更换默认发行版,这个别名也会跟着调用新的默认发行版。
常用命令
我使用 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 为什么只增不减。