WSL与Docker管理

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

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

在 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;如果以后更换默认发行版,这个别名也会跟着调用新的默认发行版。

常用命令

我使用 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 为什么只增不减