整合Podman與Visual Studio Container Tools

整合 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 DockerCompatibility

在 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 專案並啟用容器支援來測試:

ASPNETCoreMVC EnabledContainer

可以看到一行大大的提示文字「必須安裝 Docker Desktop」:

ASPNETCoreMVC EnabledContainer Info

沒關係,山不轉路轉。

當你把 Podman Desktop 的 Experimental (Docker Compatibility) 開啟後,在 Settings 下面會直接多一個 Docker Compatibility 選項,裡面有個 Docker CLI Context 的選項,確認設定是 default(npipe:////./pipe/docker_engine) 即可。

Podman DockerCompatibility DockerCLIContext

接下來,我們需要 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 專案:

ASPNETCoreMVC EnabledContainer Output

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

讓我們把專案啟動看看:

ASPNETCoreMVC EnabledContainer Podman

在 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 才能正常運作的難題。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。