Ubuntu 容器管理新選擇!Podman × Dockerfile 安裝教學與實戰攻略【無Daemon/Rootless 全解】

目次

1. 前言

容器技術的演進與受到關注的背景

近年來,在應用程式開發與運維領域,容器技術的重要性正迅速提升。尤其是在開發環境與生產環境一致的前提下,可以確保運作的可重現性,這一優點獲得眾多工程師支持。

其中最具代表性的就是 Docker,而近年來作為替代選項的Podman(ポッドマン)也越來越受到關注。Podman 提供與 Docker 幾乎相同的 CLI(命令列介面),同時具備無需常駐程序(Daemonless)、輕量化以及無需 root 權限(rootless)等特點。

為什麼選擇「Podman + Dockerfile + Ubuntu」?

本文將結合PodmanDockerfileUbuntu這三個要素,介紹在 Linux 環境下的現代化容器運用方式。

  • Ubuntu 是從新手到進階使用者都非常受歡迎的 Linux 發行版,
  • Dockerfile 是用來構建容器映像檔的藍圖,
  • 而 Podman 則是讓這些操作更彈性、更安全的次世代工具。

隨著資訊安全意識抬頭,在 Ubuntu 上使用 Podman 搭配 Dockerfile 的架構,已逐漸被個人開發者及企業採用。

本文目標與適合讀者

本篇目標在於詳細說明如何於 Ubuntu 環境下,利用 Podman 來建置 Dockerfile 並製作實用的容器

建議閱讀對象如下:

  • 有 Docker 經驗,對 Podman 感興趣者
  • 希望在安全環境下操作容器的 Ubuntu 用戶
  • 有意將容器技術導入實務開發的工程師
  • 想嘗試撰寫 Dockerfile 並用 Podman 建置映像檔的新手

本文將涵蓋基本用法、排除常見問題的技巧、以及 Docker 與 Podman 之間的差異與遷移方式。

年収訴求

2. 什麼是 Podman?

Podman 的基本介紹

Podman(Pod Manager)是由 Red Hat 為主的社群開發的次世代容器管理工具。與 Docker 一樣能建置、執行、管理符合 OCI(Open Container Initiative)規範的容器,但在設計理念和架構上有明顯不同。

最大特點在於Podman 不需要守護程序(Daemon),因此能夠運作輕盈且安全。另外也支援rootless 模式,一般用戶無需提權即可管理容器。CLI 兼容性高,基本指令用法幾乎相同。

Podman 的主要特色

以下是 Podman 幾項代表性功能:

無需守護進程(Daemonless)架構

Podman 沒有類似 Docker daemon 的常駐背景程序,提升資源效率且減少潛在資安風險。

rootless(非特權用戶)支援

即便是非管理員權限的一般用戶,也可啟動與操作容器,更適合多用戶或伺服器環境下的安全運作,極大降低安全風險。

Docker 指令高度相容

Podman 採用與 Docker 幾乎完全相同的命令結構。例如:

podman build -t myimage .
podman run -it myimage bash

因此,有 Docker 經驗的用戶,幾乎無需學習成本即可遷移

Pod(Pod)機制

引入 Kubernetes「Pod」概念,可將多個容器作為單一邏輯單元管理,大幅提升與 Kubernetes 的相容性,便於本地開發與雲端環境的接軌。

與 Ubuntu 的相容性

雖然 Podman 於 Fedora、RHEL 等發行版廣泛採用,但在Ubuntu 也可穩定運作。官方套件庫即可安裝,且設定步驟簡單。特別是 Ubuntu 20.04 LTS 之後,安裝更為便捷。

3. Ubuntu 安裝 Podman 教學

安裝前的注意事項

於 Ubuntu 安裝 Podman 前,請先確認您的 Ubuntu 版本。建議 Ubuntu 20.04 LTS 以上,較舊版本官方套件庫可能沒有相關套件。

可用下列指令查詢版本:

lsb_release -a

安裝 Podman 需要sudo 權限,即使之後用 rootless 也一樣,安裝時請先備妥。

官方套件庫安裝 Podman

在 Ubuntu 20.04 或 22.04 等新版本可直接用 APT 安裝:

sudo apt update
sudo apt install -y podman

安裝完可用以下指令確認版本:

podman --version

如需最新版:加入官方 PPA

官方套件庫通常提供的是較穩定但稍舊的版本,若需最新功能建議加入官方 PPA

. /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 update
sudo apt install -y podman

這樣就能使用與 Red Hat 或 Fedora 相同的最新 Podman。

Podman 基本運作測試

安裝完成後,先用下列指令做簡單測試:

podman info

可查看 Podman 版本、設定與支援功能(如 rootless 模式)。

再用下面指令下載官方 Alpine Linux 容器測試執行:

podman run --rm -it alpine sh

能順利啟動 shell 即表示 Podman 基本功能正常。

4. Dockerfile 基礎與 Podman 應用

什麼是 Dockerfile?

Dockerfile 是建構容器映像檔的藍圖,透過純文字描述所需的基礎映像、安裝套件、複製檔案、啟動命令等步驟。

Podman 或 Docker 這類工具就能依據這些命令,自動構建一致的執行環境。

常見範例如下:

FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]

這是典型從 Ubuntu 安裝套件、複製腳本,並指定預設執行內容的流程。

Podman 使用 Dockerfile 的方式

Podman 支援直接以 Dockerfile 構建映像,操作方式與 Docker 幾乎一致。

1. 準備目錄與檔案

請依下方結構準備:

project/
├── Dockerfile
└── app.sh

app.sh 範例腳本:

#!/bin/bash
echo "Hello from Podman container!"

請先賦予執行權限:

chmod +x app.sh

2. 用 Podman 構建映像

在 Dockerfile 目錄下執行:

podman build -t mypodmanapp .

會生成名為 mypodmanapp 的映像檔。

3. 查看映像檔

podman images

4. 啟動容器

podman run --rm mypodmanapp

正常情況下會顯示 Hello from Podman container!

Containerfile 的差異

Podman 支援用 Containerfile 替代 Dockerfile,只是檔名不同、格式完全一樣。其理念在於「不侷限於 Docker」,但實際運作和寫法沒有差別。

podman build -f Containerfile -t myimage .

-f 指定檔名即可。

5. 實作:以 Ubuntu 為基礎製作容器

撰寫以 Ubuntu 為基礎的 Dockerfile

以下示範如何以Ubuntu 為基礎的 Dockerfile,用Podman 構建與運行容器

FROM ubuntu:22.04

RUN apt update &&     apt install -y curl &&     apt clean

COPY hello.sh /usr/local/bin/hello.sh
RUN chmod +x /usr/local/bin/hello.sh

CMD ["/usr/local/bin/hello.sh"]

上述 Dockerfile 內容:

  • 使用 Ubuntu 22.04 官方映像
  • 安裝 curl
  • 複製 hello.sh 至容器內
  • 設定 hello.sh 為預設執行腳本

hello.sh 範例:

#!/bin/bash
echo "您好,這是從 Podman 容器輸出的訊息!"

請賦予執行權限:

chmod +x hello.sh

用 Podman 建構映像

podman build -t ubuntu-hello .

成功後可用:

podman images

執行並確認映像

podman run --rm ubuntu-hello

輸出範例:

您好,這是從 Podman 容器輸出的訊息!

--rm 會在結束後自動刪除容器,適合測試。

補充:互動式啟動容器

podman run -it ubuntu-hello bash

這樣即可作為 Ubuntu 開發環境使用。

6. Podman 的實用功能與技巧

Podman 的優勢:靈活與安全兼具

Podman 不僅與 Docker 相容,更具備許多提高實用性與安全性的功能。以下介紹常用技巧。

rootless 模式提升安全性

Podman 最大特色之一是rootless 模式,即一般用戶可執行容器

podman run -it ubuntu bash

所有容器資料僅限於使用者家目錄下,最大程度減少系統風險

與 systemd 整合自動啟動

Podman 可原生整合 systemd,將容器作為服務自動啟動:

podman generate systemd --name mycontainer --files --restart-policy=always

會於 ~/.config/systemd/user/ 產生服務單元檔,再執行:

systemctl --user daemon-reexec
systemctl --user enable --now container-mycontainer.service

伺服器重開後也能自動帶起容器。

podman-compose 多容器管理

除單一容器外,也可用podman-compose 管理多容器。安裝方式:

pip install podman-compose

支援 docker-compose.yml 格式,起動指令也類似:

podman-compose up -d

其他實用指令/技巧

清理未使用映像與容器

podman system prune -a

指令補全(bash/zsh)

sudo apt install podman-docker

可讓 podman 指令支援自動補全。

7. Docker 轉移至 Podman 指南

為何要轉向 Podman?

雖然 Docker 長期為容器代表,但因 Red Hat、Fedora 等推行 Podman,業界也逐步轉向更輕量與安全的 Podman。本節說明具體轉移步驟與注意事項。

Docker/Podman 指令相容性

Podman 基本上可直接替換 Docker 指令

DockerPodman
docker build -t myapp .podman build -t myapp .
docker run -it myapppodman run -it myapp
docker imagespodman images
docker pspodman ps

操作幾乎不需更動,極易遷移。

用 podman-docker 完全相容

如需保留 docker 指令,可安裝 podman-docker

sudo apt install podman-docker

安裝後 docker 其實會轉由 podman 執行:

which docker
# → /usr/bin/docker → podman 的符號連結

讓既有 Docker 腳本無需修改即可用 Podman 執行

docker-compose 替代方案:podman-compose

有多容器專案者,建議安裝 podman-compose。相容性高,但某些選項略有差異,複雜環境請先測試:

  • 部分 depends_on 等選項未完全支援
  • 事件記錄、健康檢查等細節有差異

一般常見結構可直接遷移。

映像/卷的遷移

原本 Docker 的映像,Podman 無法直接讀取,建議重新 pull 或匯出再匯入:

方法一:Podman 重新拉取

podman pull ubuntu:22.04

方法二:Docker 匯出 → Podman 匯入

# Docker 匯出
docker save myimage > myimage.tar

# Podman 匯入
podman load < myimage.tar

其他注意事項

  • rootless 支援差異:Docker 預設需 root,Podman 標準即支援 rootless
  • 守護進程差異:Podman 無 daemon,背景程序管理方式不同
  • 日誌與數據存放位置不同,遷移時建議檢查設定

8. 常見問題(FAQ)

Q1. Podman 與 Docker 最大差異是?

A1. 最大不同在於Podman 為「無需守護進程(daemonless)」運作,更輕量、更安全;且支援rootless 模式,一般用戶也能操作。CLI 兼容性高,操作習慣幾乎無需改變。

Q2. Dockerfile 和 Containerfile 差異?

A2. 功能完全相同,只是檔名不同。Podman 社群偏好用中立名稱「Containerfile」,但寫法一致、實務上用 Dockerfile 亦可。

Q3. Podman 可以用 Docker Compose 嗎?

A3. 無法直接用,但可安裝 podman-compose,支援 docker-compose.yml 檔案。部分選項(如 depends_on)略有限制,複雜情境請先測試。

Q4. Podman 在 Ubuntu 上穩定嗎?

A4. 是的,Ubuntu 20.04 LTS 以上皆穩定。官方套件庫即可安裝,需新版建議加官方 PPA。

Q5. rootless 模式有權限限制嗎?

A5. rootless 模式下,某些特權操作與 1024 以下埠口會被限制,但可透過埠轉發繞過。大多應用情境 rootless 皆足夠。

Q6. Podman 下載的映像與 Docker Hub 相同嗎?

A6. 是的,Podman 預設支援 Docker Hub,也支援 Quay.io、GitHub Container Registry 等,部分情況需明確指定 registry 名稱。

podman pull docker.io/library/ubuntu

Q7. Podman 適用於生產環境嗎?

A7. 適用,Podman 提供 Kubernetes 相容 Pod 機制、systemd 整合等,特別適合安全要求高的場域,並已在 Red Hat Enterprise Linux、Fedora 等大規模部署。

參考連結

侍エンジニア塾