在 Windows 的環境,要使用 Docker 除了 Docker Desktop 之外,也可以使用 WSL + Docker 來完成環境的搭建

通過 Windows Terminal 執行命令
https://apps.microsoft.com/detail/9n0dx20hk701?hl=zh-TW&gl=TW
開發環境
- Windows 11 Home
- PowerShell 7.4.6
- WLS2
安裝 Windows Subsystem for Linux (WSL)
- 以 Administrator 執行 Windows Terminal 。
- 使用以下命令安裝 WSL和啟用虛擬化功能:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 完成後,重新啟動電腦。
- 重啟後,執行以下命令 WSL 設定為版本 2
wsl --set-default-version 2
安裝 Ubuntu 24.04.1 LTS
方法一:Microsoft Store
https://apps.microsoft.com/detail/9nz3klhxdjp5?hl=zh-tw&gl=TW
方法二: WSL 命令行安装
列出可用的版本
wsl -l -o
╰─ wsl -l -o
以下是可安裝的有效發佈的清單。
使用 'wsl.exe --install <Distro>' 安裝。
NAME FRIENDLY NAME
Debian Debian GNU/Linux
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
Ubuntu Ubuntu
Ubuntu-24.04 Ubuntu 24.04 LTS
kali-linux Kali Linux Rolling
openSUSE-Tumbleweed openSUSE Tumbleweed
openSUSE-Leap-15.6 openSUSE Leap 15.6
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTS
Ubuntu-22.04 Ubuntu 22.04 LTS
OracleLinux_7_9 Oracle Linux 7.9
OracleLinux_8_7 Oracle Linux 8.7
OracleLinux_9_1 Oracle Linux 9.1
安裝 Ubuntu 24.04.1 LTS
wsl --install -d Ubuntu-24.04
配置 Ubuntu


安裝 Docker
升級套件
- 開啟 Windows Terminal
- 選擇 Ubuntu 24.04.1 LTS
- 執行以下命令
sudo apt update && sudo apt upgrade -y
sudo apt install -y --no-install-recommends apt-transport-https ca-certificates curl gnupg
安裝中,如下圖:

安裝 Docker
. /etc/os-release
curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo tee /etc/apt/trusted.gpg.d/docker.asc
echo "deb [arch=amd64] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
安裝過程如下圖:

安裝完之後就可以使用 docker versio,查看目前 docker 的版本,但是出現授權的問題,如下圖:

配置 Docker 授權
將當前使用者加入 Docker 群組
sudo usermod -aG docker $USER
更新 Docker 群組設定
sudo sed -i -e 's/^\(docker:x\):[^:]\+/\1:36257/' /etc/group
重新初始化 WSL,離開當前頁簽,Ctrl+D,在 Powershell 輸入
wsl --shutdown
Note:WSL 沒有重啟的命令,只要 shutdown 之後,再進入 wsl 就會啟動了

檢測 Docker
這次再查看 docker version 時,就沒有出現問題了,如下圖:

用 docker 運行 ubuntu 試試看
docker run -it ubuntu bash
如下圖:

在 Windows 連接 WSL2 的 Docker Engine
參考保哥這篇:如何移除 Docker Desktop 並在 Windows 與 WSL 2 改安裝 Docker Engine | The Will Will Web
在 WSL 執行
# 透過 WSL 2 的 systemd 服務啟動 Docker Engine
if grep -q "\-WSL2" /proc/version > /dev/null 2>&1; then
if service docker status 2>&1 | grep -q "is not running"; then
wsl.exe --distribution "${WSL_DISTRO_NAME}" --user root \
--exec /usr/sbin/service docker start > /dev/null 2>&1
fi
fi
# 讓 dockerd 同時聽 Unix 與 TCP
sudo tee /etc/docker/daemon.json <<'EOF'
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://127.0.0.1:2375"
]
}
EOF
# systemd 背景服務設定 (docker.service)
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf <<'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
EOF
# 套用變更
sudo systemctl daemon-reload
sudo systemctl restart docker
# 驗證
ss -lntp | grep 2375

設定環境變數
在 Windows 執行
設定 DOCKER_HOST 環境變數
PowerShell,僅在當前 session 有效
$env:DOCKER_HOST='localhost:2375'
Command Prompt,僅在當前 session 有效
set DOCKER_HOST=localhost:2375
用 Powershell 設定個人系統變數,也可以到控制台設定,永久有效
[System.Environment]::SetEnvironmentVariable('DOCKER_HOST', 'localhost:2375', [System.EnvironmentVariableTarget]::User)
安裝 docker cli
scoop install docker
scoop install docker-compose
測試是否連接到 WSL 的 docker engine
docker version

若出現以下錯誤,可能是 WSL 還沒有啟動,給他一點時間
error during connect: Get "http://localhost:2371/v1.51/version": dial tcp [::1]:235: connectex: No connection could be made because the target machine actively refused it.
啟動容器
docker run --rm -it hello-world

這樣就成功了
心得
這個方法就可以不需要在 Windows 上安裝 Docker Desktop,感覺更輕量些了,吧?
實作的過程如果要重來一遍,先取消註冊
wsl --unregister Ubuntu-24.04
安裝
wsl --install -d Ubuntu-24.04
在 Windows Terminal 再進入 Ubuntu-24.04,就可以拿到一個新的環境。

若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET