Skip to content

Apple M3 上的 Podman Desktop 終於可以用啦!

如果你跟我一樣是 Apple M3 系列的使用者,平時有不少工作需要仰賴跑 Container 來完成的,那我相信你一定會對 2024/1/24 Podman Desktop Release 1.7 的釋出感到開心,這個版本修復了 QEMU on Apple M3 的問題,讓我們可以在 M3 上使用 Podman 跑 Container 了!

Podman Desktop 使用場景

常見使用場景:

  1. 單獨把一個 Container 放到 Podman Container Engine 上運行
  2. 把 Container 轉成 Pod 放到 Local Kubernetes 環境上運行, 如 OpenShift Local / KIND / Minikube 上運行
  3. 把 Container 轉成 Pod 放到 Podman Container Engine 環境上運行,然後再部署到 Kubernetes 上
  4. 使用 Docker Desktop Extension 常見的功能,例如掃描漏洞等
  5. 編譯 Container Images

1. 單獨跑一個 Container

一個相當經典的使用方式,這邊以我自己維護的 pichuang/debug-container 為例,上圖的操作會等同於下面指令

podman-run
$ docker pull ghcr.io/pichuang/debug-container:master
$ podman pull ghcr.io/pichuang/debug-container:master

$ docker images --filter reference=debug-container
$ podman images --filter reference=debug-container
REPOSITORY                        TAG         IMAGE ID      CREATED       SIZE
ghcr.io/pichuang/debug-container  master      127df4e7af3f  12 hours ago  713 MB

$ docker run -it --privileged --rm ghcr.io/pichuang/debug-container:master
$ podman run -it --privileged --rm ghcr.io/pichuang/debug-container:master
[root@2ae1a1c62ba3 ~]#

是毫無懸念地使用方式,跟指令的差異就是有 Desktop 可以用滑鼠點一點操作就完成了

2. 把 Container 轉換 Pod 塞到 Kubernetes cluster 環境上運行

差異就是把定義好的 debug-container.yamlkubectl apply -f 塞到指定的 Kubernetes cluster 上運行,要留意的事情是,這邊 Podman Desktop 不會顯示 Kubernetes 上的資訊,你得要用 kubectl get pods 來查看,上圖的操作會等同於下面指令

kubectl-apply
$ kind get clusters
enabling experimental podman provider
kind-cluster

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:63290
CoreDNS is running at https://127.0.0.1:63290/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

$ kubectl apply -f debug-container.yaml
pod/debug-container configured

$ kubectl get pods -n default
NAME              READY   STATUS    RESTARTS   AGE
debug-container   1/1     Running   0          2m15s

3. 把 Container 轉換 Pod 塞到 Podman Container Engine 環境上運行

3.1 先把 Kubernetes YAML 在本機用 Podman Containe Enginer 運行起來

關於 4,podman 全名應為 Pod Manager,他本身設計基礎是以 Pod 為單位作為設計的,所以他可以支援把 Kubernetes 的 YAML 轉換成 Pod 並且直接用 Podman Container Engine 運行起來,相當適合你尚未把服務放到 Kubernetes 之前,單純想要對 Pod 這個範圍內的操作進行顆粒度較細的調教,這會節省很多時間,上圖的操作會等同於下面指令

podman-play-kube
$ podman play kube ./debug-container.yaml
Pod:
90f1cc5b5affd866a360118f65bfaa840396e74f6bd6294b12e743ad0660d77b
Container:
1b092b950e1c2fbdb8b896dfc22a4b3d23c0ffe902c39d95a363cd098086e781

$ podman pod ps --ctr-names --ctr-ids
POD ID        NAME             STATUS      CREATED         INFRA ID      IDS                        NAMES
90f1cc5b5aff  debug-container  Running     12 minutes ago  b08f52f1aab7  b08f52f1aab7,1b092b950e1c  90f1cc5b5aff-infra,debug-container-debug-container

$ podman exec -it 1b092b950e1c /bin/bash
[root@debug-container ~]#

3.2 再把 Pod 轉換成 Deployment 部署到 Kubernetes 上

關於 5-6,在 Pod 的欄位內,有支援將當前的 Pod 直接產生 Pod YAML部署到指定的 Kubernetes 之上,如果你是本機開發的話,會是一個相當方便的功能,點一點就可以跑到 Kubernetes 為底的環境運行了

部署到指定的 Kuberentes 之上 這個階段,雖然能做的事情不像 kubectl apply 自己下指令來的多樣,但就以 Pod 這個範圍的測試開發來講,是可以考慮使用的路線,真不行的話,你就自己產生 Deployment YAML 來部署就好了

podman-generate-kube-pod
# podman generate kube podID
# https://docs.podman.io/en/latest/markdown/podman-kube-generate.1.html
$ podman generate kube --type pod debug-container
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.8.3
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-02-05T17:49:38Z"
  labels:
    app: debug-container
  name: debug-container
spec:
  containers:
  - args:
    - while true; do sleep 30; done;
    command:
    - /bin/bash
    - -c
    - --
    image: ghcr.io/pichuang/debug-container:master
    name: debug-container-debug-container
    securityContext: {}
  restartPolicy: Always

倘若你覺得這個 Pod 跑起來沒啥問題,想要換成用 Deployment 的方式跑,那你可以用下面指令,改一下 --type deployment 就可以或得到一個會動的 Deployment YAML,然後再隨需求細修參數即可

podman-generate-kube-deployment
$ podman generate kube --type deployment debug-container --service
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.8.3
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2024-02-05T17:47:00Z"
  labels:
    app: debug-container
  name: debug-container
spec:
  selector:
    app: debug-container
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: "2024-02-05T17:47:00Z"
  labels:
    app: debug-container
  name: debug-container-deployment
spec:
  selector:
    matchLabels:
      app: debug-container
  template:
    metadata:
      creationTimestamp: "2024-02-05T17:47:00Z"
      labels:
        app: debug-container
      name: debug-container
    spec:
      containers:
      - args:
        - while true; do sleep 30; done;
        command:
        - /bin/bash
        - -c
        - --
        image: ghcr.io/pichuang/debug-container:master
        name: debug-container-debug-container
        securityContext: {}
      restartPolicy: Always

4. 安裝相容 OCI 格式的 Extenstion

Podman Desktop 內建其實沒這 Aqua Trivy 功能,需要另外裝,故我想強調的事情是,這工具也支援安裝既有 Docker Desktop Extenstion,可以去 Dockerhub 這邊找到需要的服務網址後裝進去

5. 編譯 Container Images

也是經典使用方式,但我還沒研究怎麼在筆電同時編出 aarch64 和 x86_64 想到再來補

$ podman build -t my-custom-image -f Dockerfile

Q&A

Q1: Docker Desktop 和 Podman Desktop 怎麼挑?

我的看法還以原廠售後支援功能支援 兩個角度來看

  1. 售後產品支援

    • 你如果是以 Docker 為主或者是有愛好的人,建議以 Docker / Docker Desktop 體系為主,Docker 原廠 (與 Mirantis 無關) 有提供 Docker Desktop 原廠產品售後支援
    • 你如果是以 Red Hat 體系或很清楚容器運作的人,建議以 Podman / Podman Desktop 體系為主,跟前者不太一樣的是,Red Hat 支援是以 Red Hat Enterprise Linux 產品角度支援,有中文支援
  2. 功能支援

    基於此文 Missing commands, 比較 Missing commands in podmanMissing commands in docker 內有沒有你本來就在用的指令,如果有的話,就可以用功能性評估進行選擇,因為歷史典故,所以都是看 Missing commands in podman 這個表格就好,只要裡面你看完都沒有你要用的指令,恭喜你,你兩邊都可以選,使用起來沒差

Q2: 如果初次使用 podman, 但我指令或程式都寫 docker 該怎麼辦?

$ alias docker=podman
$ which docker
docker: aliased to podman

這不是開玩笑的,認真這樣做

Q3: Podman Desktop v.s. Docker Desktop v.s. Lens v.s. k9s?

你如果是維護 Kubernetes 的人,請看 Lens / k9s 是你的好選擇,主要他們都是針對 Kubernetes API 進行操作管理 你如果是開發或打包 Container 程式部署的人,請看 Podman Desktop / Docker Desktop 為主

Q4: 現行軟硬體版本資訊?

於 20240206 快照版本資訊

  • Apple M3 Pro
  • macOS 14.3
  • Podman Desktop v1.7.0
  • Podman v4.9.0
  • OpenShift Local v2.32.0

Q5: 如何安裝 Podman Desktop 和他的相依性套件?

強烈建議從官網上先把 Podman Desktop 安裝好,然後再透過這個介面去安裝其他的,不然可能會遇到一些靈異現象

https://podman-desktop.io/downloads

Q6: Mirantis 和 Docker 的關係?

雖然 2019/11/13,Miratnis 併購 Docker,但目前兩家還是不一樣的公司,因為產品線不一樣

基於 Discover Mirantis Products Learn,Mirantis 主要提供下列產品和專案

  • Mirantis Container Cloud
  • Mirantis Kubernetes Engine
  • Mirantis Container Runtime (前身為 Docker Engine - Enterprise)
  • Mirantis Secure Registry
  • Mirantis OpenStack for OpenStack
  • Lens IDE
  • k0s
  • Lagon

基於 Docker subscriptions and features,Docker 主要提供下列產品和專案

  • Docker Engine
  • Docker compose
  • Docker Kubernetes
  • Docker Hub
  • Docker Desktop

當中就是 Docker Engine 的支援問題,按照 Docker Support 的文件描述相當妙

Docker doesn't provide support for Docker Engine. Docker provides support for Docker products, including Docker Desktop, which uses Docker Engine as one of its components.

所以無論是 Docker Engine 還是 Docker Compose 的支援,都應該去找 Docker 原廠,而不是 Mirantis 原廠

總結

  • 你是開發者,需要 Docker DesktopDocker Engine 的使用支援,需要找 Docker 原廠訂閱服務
  • 你是維運者,需要受企業支援的 Container Rutime,那你應該要找 Mirantis Container Runtime 也就是 Docker-EE 路線,可參考 Mirantis Container Runtime 的安裝文件,而不是找 Docker 原廠

Q7: Dev Container 預設用 Docker 誒,怎麼改成 Podman?

很簡單, 下面一發解決

$ sudo vim /usr/local/bin/docker
#!/bin/bash
exec podman "$@"

$ sudo chmod +x /usr/local/bin/docker

然後重開 VSCode 就好了

文後廢言

最近看香格里拉·開拓異境,根本就是魂系列遊戲的動畫化,就想到其實我工作也是常遇到很多客戶的特規需求,常常加班用一些怪招研究測試半天,最終通過難關,忽然覺得我是個充滿著魂精神的系統架構師: 高自由度 (怪招多)、高難度 (客戶要求通常文件上都沒寫)、高挑戰 (自己挑燈夜戰搞出來)

Reference

Comments