整合 Podman 與 Visual Studio Container Tools
由於 Kubernetes 的導入,目前公司內的 Windows Container 已所剩無幾,並且 Docker Desktop 現有授權的關係,在公司使用 Docker Desktop 是需要每年採購授權的。因此想要嘗試改用 Podman,在轉換至 podman 過程有二件事:
- 習慣了
docker
CLI,要改成podman
CLI - Visual Studio 無法和 podman 溝通,因此,如果要需要整合容器開發環境,會有開發上問題
我是在 Windows 安裝 Podman Desktop,因此需要先把 WSL 安裝設定好。
讓 Podman CLI 相容 Docker CLI
一開始安裝好 Podman Desktop 之後,會請你先建立一個預設的 podman-machine,建立之後,如果你是使用 Windows Terminal 的話,下拉選單會多出一筆「podman-machine-default
」選項,進入之前就能進入 podman CLI 執行環境:
[user@kkbruce ~]$ podman version
WARN[0000] Using cgroups-v1 which is deprecated in favor of cgroups-v2 with Podman v5 and will be removed in a future version. Set environment variable `PODMAN_IGNORE_CGROUPSV1_WARNING` to hide this warning.
Client: Podman Engine
Version: 5.2.3
API Version: 5.2.3
Go Version: go1.22.7
Built: Tue Sep 24 08:00:00 2024
OS/Arch: linux/amd64
[user@kkbruce ~]$ podman info
WARN[0000] Using cgroups-v1 which is deprecated in favor of cgroups-v2 with Podman v5 and will be removed in a future version. Set environment variable `PODMAN_IGNORE_CGROUPSV1_WARNING` to hide this warning.
host:
# 內容簡略過
arch: amd64
kernel: 5.15.167.4-microsoft-standard-WSL2
linkmode: dynamic
logDriver: journald
os: linux
registries:
search:
- docker.io
version:
APIVersion: 5.2.3
Built: 1727136000
BuiltTime: Tue Sep 24 08:00:00 2024
GitCommit: ""
GoVersion: go1.22.7
Os: linux
OsArch: linux/amd64
Version: 5.2.3
話說,這個 podman
CLI 環境有夠難用,除了 podman
CLI,我連執行個 clear
都不行,讓我們改一下設定,讓 podman
CLI 相容 docker
CLI。
在 Podman Desktop 的設定有個 Experimental (Docker Compatibility) 的設定,只要開啟這組設定,就可以解決不習慣 podman
CLI 的問題,就能回到 docker
CLI 的世界。
[user@kkbruce ~]$ docker version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
WARN[0000] Using cgroups-v1 which is deprecated in favor of cgroups-v2 with Podman v5 and will be removed in a future version. Set environment variable `PODMAN_IGNORE_CGROUPSV1_WARNING` to hide this warning.
Client: Podman Engine
Version: 5.2.3
API Version: 5.2.3
Go Version: go1.22.7
Built: Tue Sep 24 08:00:00 2024
OS/Arch: linux/amd64
整合 Visual Studio Container Tools
以為處理好 podman
CLI 之後,Visual Studio 裡的 Container Tools 就能順利跑起來,結果沒有。我們開一個 ASP.NET Core MVC 專案並啟用容器支援來測試:
可以看到一行大大的提示文字「必須安裝 Docker Desktop」:
沒關係,山不轉路轉。
當你把 Podman Desktop 的 Experimental (Docker Compatibility) 開啟後,在 Settings 下面會直接多一個 Docker Compatibility 選項,裡面有個 Docker CLI Context 的選項,確認設定是 default(npipe:////./pipe/docker_engine)
即可。
接下來,我們需要 docker
CLI 來跟 Podman 的 default(npipe:////./pipe/docker_engine)
溝通,但我們已經沒有安裝 Docker Desktop 了呀!
docker
CLI 是可以獨立安裝的,我們透過 winget 來協助一下:
PS C:\> winget install Docker.DockerCLI
找到 Docker CLI [Docker.DockerCLI] 版本 27.3.1
此應用程式已由其擁有者授權給您。
Microsoft 不負任何責任,也不會授與協力廠商封裝的任何授權。
已成功驗證安裝程式雜湊
正在擷取封存...
已成功擷取封存
正在啟動套件安裝...
已修改路徑環境變數;重新啟動命令介面以使用新值。
新增的命令列別名: "docker"
新增的命令列別名: "dockerd"
已成功安裝
安裝之後重開你的 PowerShell,執行 docker
CLI:
PS C:\> docker version
Client:
Version: 27.3.1
API version: 1.41 (downgraded from 1.47)
Go version: go1.22.7
Git commit: ce12230
Built: Fri Sep 20 11:42:27 2024
OS/Arch: windows/amd64
Context: default
Server: linux/amd64/fedora-40
Podman Engine:
Version: 5.2.3
APIVersion: 5.2.3
Arch: amd64
BuildTime: 2024-09-24T08:00:00+08:00
Experimental: false
GitCommit:
GoVersion: go1.22.7
KernelVersion: 5.15.167.4-microsoft-standard-WSL2
MinAPIVersion: 4.0.0
Os: linux
Conmon:
Version: conmon version 2.1.12, commit:
Package: conmon-2.1.12-2.fc40.x86_64
OCI Runtime (crun):
Version: crun version 1.17
commit: 000fa0d4eeed8938301f3bcf8206405315bc1017
rundir: /run/crun
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL
Package: crun-1.17-1.fc40.x86_64
Engine:
Version: 5.2.3
API version: 1.41 (minimum version 1.24)
Go version: go1.22.7
Git commit:
Built: Tue Sep 24 08:00:00 2024
OS/Arch: linux/amd64
Experimental: false
可以看到 Server 部份連上了我們 podman-machine。
確定一下其他 docker
CLI 的操作:
PS C:\> docker pull nginx
Using default tag: latest
773c63cd62e4: Download complete
9ad567d3b8a2: Download complete
4b0adc47c460: Download complete
1d2712910bdf: Download complete
9b1039c85176: Download complete
171eebbdf235: Download complete
2d429b9e73a6: Download complete
60c8a892f36f: Download complete
docker.io/library/nginx:latest
重新開啟剛剛建立的 ASP.NET Core MVC 專案:
Visual Studio 沒有錯誤訊息了,也發現 Container Tools 有正常在跑了。
PS C:\> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 60c8a892f36f 6 weeks ago 196MB
mcr.microsoft.com/dotnet/aspnet 8.0 6d7e7cb08845 5 days ago 221MB
webapplication1 dev e6090be04289 2 minutes ago 221MB
讓我們把專案啟動看看:
在 Visual Studio Container Tools 透過 docker
CLI 去呼叫 Podman 的 default(npipe:////./pipe/docker_engine)
來與 podman-machine 溝通都很正常,建立映像檔、執行容器也沒有問題了。
小結
Podman 的 default(npipe:////./pipe/docker_engine)
提供了一個很好的相容性介面,讓我們可以透過原有的 docker
CLI 來操作 podman-machine。獨立安裝 docker
CLI 之後,更是解決了原本 podman
CLI 在 Windows Terminal 裡難用的問題,也可以直接在 Windows Terminal 去用美美的 PowerShell 執行環境來執行 CLI,也一併解決 Visual Studio Container Tools 需要 Docker Desktop 才能正常運作的難題。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。