CONTAINER STUDY NOTE

Podman on Mac 101

紀錄在 Mac 上安裝 Podman 的過程

Azole (小賴)
8 min readNov 3, 2021

以下文章主要內容來自 How Podman runs on Macs and other container FAQs

What Podman?

What is Podman? Podman is a daemonless container engine for developing, managing, and running OCI Containers on your Linux System. Containers can either be run as root or in rootless mode. Simply put: alias docker=podman.

Podman 是 RedHat 發布的開源容器管理工具,根據官網的解釋,Podman 是 daemonless 的 container 引擎,而且可以以 root 或是非 root 的模式來執行,官網還建議你在自己的環境對 podman 做一個 docker 的別名,想要取代 docker 的狼子野心表露無遺啊!🤣

Why Podman?

那 docker 用得好好的,為什麼要用 Podman 呢?除了 Docker 自己一些事外(例如商業版收費?),最主要是 Podman 在架構上做了一些有別於 Docker 的設計,也算是改善了一些 Docker 的老問題。

docker 是一個 client/server 的架構,它會有一個 Docker daemon (dockerd) 在被背景執行,接收我們下的 docker 命令,然後負責建置與運行 Docker container,除此之外, 這個 daemon 還負責管理像是 images, networks 跟 volumes 等,那可以想像一下,如果這個 daemon 程式掛掉了呢?是不是所有的 container 就都跟著掰掰了呢?再來是,所有的操作都必須由跟 root 相同權限的使用者來執行,這可能會引發一些安全漏洞問題。

來源: https://darumatic.com/blog/podman_introduction

而 Podman 的設計方式就截然不同了,Podman 能直接與 Image registry, containers 及 images 溝通,而且允許已非 root 的使用者權限來運行 containers,除此之外,很重要的一點,它提供了跟 docker 相容的指令,讓習慣使用 docker 的我們也能無痛改用 Podman。(參考資料: Podman — Introduction

Podman on Mac

container 其實是很 linux 的東西,所以其實我們在 macOS 或是 Windows 上使用 docker 的時候,其實都是在 docker 用 Linux Kit 建立的 VM 中執行的,不過在用 docker 的時候很無縫接軌,所以大家對這層 VM 沒有太多的感覺。

這一點對使用 Podman 來說也不會例外,不過 Podman 需要自己初始化這台 VM,所以會更有感覺一點,廢話不多說,直接來用用看:

安裝

❯ brew install podman# 如果是 M1 的話,可以試試
❯ brew install podman

初始化 VM

❯ podman machine init
  • 當我們執行這行指令時,Podman 會去檢查我們的 host 裡是否有最新的 FCOS,沒有的話,就會去下載。FCOS 的全名是 Fedora CoreOS,他被設計成基於 container 的最小化現在作業系統,Podman 會用這個作業系統來建立 VM。
  • 當 FCOS 被下載完成後,還會再寫兩個檔案:
  1. machine description: 用來描述即將建立的 VM 的屬性,是 JSON 格式,而且是被寫入 host 的 filesystem 中。

2. ignition file: 用來客製 FCOS 作業系統的,也會被寫入 host filesystem 中。

啟動 VM

❯ podman machine start

當這個指令被運行時,machine 的設定檔會被讀取,然後 Podman 會確保這個 machine 不是在運行中。然後會基於這些設定檔,qumu 會被組裝,然後 VM 就運行起來了。

備註: QEUM 是一個開源的代管虛擬機器,Podman 會使用 QEMU 來建立 VM,網路上有些文章寫說得先安裝 qemu,不過也許是因為版本的關係,我自己實測的經驗是不需要的。

透過活動監視器可以看到,machine 在啟動時,會有一個 qemu-system 的 process 在:

當 VM 第一次開機時,ignition file 會被注入到這個VM 中,數個設定也會在這個時候被修改,當 VM 開完機後,會有一個叫做 gvproxy 的程式會在 host 被啟動,gvproxy 會負責管理 host 與 VM 之間的 port mapping。最後 Podman 會為 root 及 non-root 使用者設置 socket-activated services。

管理 Machine

❯ podman machine -h
Manage a virtual machine
Description:
Manage a virtual machine. Virtual machines are used to run Podman.
Usage:
podman machine [command]
Available Commands:
init Initialize a virtual machine
list List machines
rm Remove an existing machine
ssh SSH into an existing machine
start Start an existing machine
stop Stop an existing machine

根據 help,有以上這些功能可以用,可以 ssh 進去這件事還蠻好玩的,然後沒有用的時候也可以先停掉。

開始使用~

就跟 docker 一樣,結束。

# 例如以下指令是可以運行一個 nginx container 的
podman run -dt -p 8080:80 nginx

感覺很還不錯對吧,不過不過,這邊有一個對 mac 使用者來說的巨坑,那就是…

I want to be able to bind mount content from the host into the Linux VM.

We are working on this as well. It’s not tied to the GUI work, and we expect to deliver it in subsequent Podman releases.

各位觀眾,這意思是說,在 mac 上,如果你想要從你的 host 掛載檔案夾進 container,目前是辦不到的…😭

❯ podman run -it --rm -v $(pwd)/podman:/home/podman nginx
Error: statfs /Users/ashley/xxx/podman: no such file or directory

結論

整體的安裝跟使用過程其實很舒服,也覺得不像 docker 那樣笨重,而且很喜歡自己可以啟動 VM 這件事。只是不能掛載 volume 這件事實在有點囧囧,希望 Podman 團隊能趕快解決這件事,能解決的話,我應該會直接換成用 Podman,不會再安裝 docker 了。

參考資料

Install on Ubuntu 20.04

https://podman.io/getting-started/installation

. /etc/os-release
echo "deb <https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/> /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L "<https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key>" | sudo apt-key add -
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install podman
# 20.10 就不用這麼麻煩
# linux 不需要用到 VM

--

--

Azole (小賴)
Azole (小賴)

Written by Azole (小賴)

As a passionate software engineer and dedicated technical instructor, I have a particular fondness for container technologies and AWS.