為什麼有這種需求

目前我使用容器的主力是 Podman 不過有些跟容器整合的工具(e.g. AWS SAM CLI, act)是只支援 Docker 這套工具的,對於 Podman 的支援官方是從不保證能通。有礙於這類工具實在對於生產力很有幫助,所以開始研究兩者並存的可能性。不過因為 Docker Desktop 因為已經不是免費了,所以目標就是只安裝 docker engine,然後用 docker client cli 來使用 service 。

前置條件

這篇是以 Podman 已經安裝好的情形下來展示,如何接續安裝 Docker engine。

確認 wsl 版本是 version 2

wsl --set-default-version 2

更新 wsl 避免踩到舊版的坑

wsl --update

安裝指定版本號,這邊直接指定最新的 Ubuntu 版本

wsl --install -d Ubuntu-22.04

停止該虛擬機器,因為我們要準備把虛擬硬碟從預設路徑搬移出去

wsl -t Ubuntu-22.04

匯出

wsl --export Ubuntu-22.04 {new path}\Ubuntu-22.04.tar

解除註冊

wsl --unregister Ubuntu-22.04

在新的地方重新註冊虛擬機

wsl --import Ubuntu-22.04 {new path}\Ubuntu-22.04 {new path}\Ubuntu-22.04.tar

進入虛擬機器裡

wsl -d Ubuntu-220.4 --user {your_user_name}

更新 Ubuntu 內的套件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

安裝docker engine

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

基本上做到這邊 docker 就已經安裝完成。但可以測試一下 docker 是否安裝成功

sudo docker run hello-world

Docker engine 設定

確認虛擬機內 wsl.conf 設定

cat /etc/wsl.conf

要有以下的內容

1
2
3
[boot]
systemd=true
command=sudo service docker start

接下來為了要讓我們可以直接從 windows 下指令,我們要在以下路徑追加設定

sudo mkdir -p /etc/systemd/system/docker.service.d/

sudo vi /etc/systemd/system/docker.service.d/tcp.conf

內容如下:

1
2
3
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2377 --containerd='/run/containerd/containerd.sock'

第一個 ExecStart= 這行設定不是誤植,是為了避免有別的地方已經有設定 ExecStart 導致執行時發生錯誤,若有衝突會有以下類似訊息:

docker.service: Service has more than one ExecStart= setting

更動完設定重啟 wsl

1
2
wsl -t Ubuntu-22.04
wsl -d Ubuntu-22.04 --user {your_user_name}

更動完設定後重啟 docker

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

確認服務的狀態 sudo service docker status

Host (Windows) 的設定

回到 windows 環境

1
scoop install main/docker

這邊安裝 docker 主要是為了他的 docker.exe 執行檔,可以不用在 windows 身上將 dockerd 作為服務運行起來。

環境變數新增以下的值(新增成使用者變數就好):

1
[Environment]::SetEnvironmentVariable('DOCKER_HOST', 'tcp://localhost:2377', 'User')

注意事項

這邊 port 故意開 2377 而不是預設的 2375 是為了不要跟 Podman 打架,不然一次只能開一個起來。

兩個同時安裝起來後,雖然可以同時作用,但是 Podman desktop 卻無法作用,之前的下載的 image 跟 container 都消失了,這點目前還不知道原因。 Orz

Reference