iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0
Cloud Native

駕馭商用容器叢集,汪洋漂流術系列 第 19

【Day 19】 從 Docker 棄坑、你需要使用 Podman 的理由

  • 分享至 

  • xImage
  •  

前言

2013 年 Docker 公司(當時叫 dotCloud)公開了 Docker 專案,把 Linux 上的 LXC (Linux Containers) 包裝成「開發者友善」的工具,使得 Docker 一詞幾乎成為「容器」的代名詞。 隨著 Docker 的普及,問題也慢慢浮現,Docker Engine 太龐大,runtime、CLI、Daemon、build、network、volume 等功能,全都綁在一起。 然後要用到容器的環境如 K8s,通通都要同捆全裝。 Docker 公司想商業化(Docker EE),但社群希望保持開源

2017 時,Docker Engine 變成 Moby Project 進行 Docker Engine 的開源化重構,把原本 monolithic 的 Docker Engine,拆分成許多組件。 containerd(容器執行核心)runc(呼叫 Linux namespace/cgroup 的 runtime)BuildKit(建構映像)SwarmKit(叢集),讓社群或廠商能自由組合需要的部分。

今天要來介紹一個近年來越來越受到矚目的容器工具 — Podman。 使用過 Docker 的話,你會發現 Podman 的指令幾乎一模一樣,不過 Podman 在設計理念與安全性上有著非常大的不同。

Docker 難搞的地方

  1. 古早時代,要運作容器,需要安裝 Docker Daemon,不過有時候開發者使用的電腦環境,是權限被限制會是拔除的情形,沒有 root 權限,導致無法執行 Docker Daemon。
  2. 賦予 Docker Daemon 權限的話,如果當 Daemon 出現漏洞,整個系統的安全就受到威脅。
  3. 有時候,為了方便,會把一般使用者加入 Docker 的 Group。 雖然這樣呼叫 docker 指令就不用 sudo 了,但是也會間接使一般使用者可以拿容器為非作歹呀。

因為 docker 具有 Host 的 root,你可以把特定的目錄 bind-mount 掛進容器裡面,並且在容器中做一些外面不能做的指令。

Podman 的誕生

Podman (short for pod manager) is an open source tool for developing, managing, and running containers. Developed by Red Hat® engineers along with the open source community, Podman manages the entire container ecosystem using the libpod library.

Podman’s daemonless and inclusive architecture makes it an accessible, security-focused option for container management. Its accompanying tools and features, such as Buildah and Skopeo, let developers customize their container environments to suit their needs. Developers can also take advantage of Podman Desktop, a graphical user interface (GUI) for using Podman in local environments.

  • 基於前面提到的問題,於是在 2018 時,Red Hat 帶頭開發了 Podman (Pod Manager),設計理念是 Daemonless + Rootless,不要跑一個背景吃資源,也避免用 root 權限跑容器。

Daemonless(無常駐進程)

  • Podman 不需要像 Docker 一樣有一個長駐的 Daemon。
  • 每個容器直接由 CLI 控制,這讓它更加輕量、安全。

Rootless 支援

  • Podman 容器可以用一般使用者身份執行,不需要 root 權限。
  • 這對於多租戶環境以及安全要求高的系統非常重要。

相容 Docker CLI

  • 幾乎所有 docker run、docker build 的指令,換成 podman run、podman build 就能直接執行。

Pod 概念(類似 Kubernetes)

  • Podman 內建 Pod 的概念,一個 Pod 可以包含多個 Container,和 Kubernetes 的設計理念一致,非常適合用來做本地開發或測試。

實作

安裝

  1. 不管你的系統是什麼,大部分的系統都支援,以下 Linux 為例:
    # CentOS / RHEL
    sudo yum -y install podman
    
    # Ubuntu / Debian
    sudo apt-get -y install podman
    
    # 裝好之後驗收指令
    podman --version
    

常用指令比較 / Docker 和 Podman 矛盾大對決

功能 Docker 指令 Podman 指令
執行容器 docker run -it alpine sh podman run -it alpine sh
查看容器 docker ps podman ps
建立映像 docker build -t myapp . podman build -t myapp .
登入 Registry docker login podman login
移除容器 docker rm <id> podman rm <id>

看起來是換湯不換藥

Podman 的特別之處

  1. Rootless Container
    • 當用 podman 運行起來的容器,從 裡面看是 root ,從 外面看是一般使用者
  2. 適合叢集使用者跑 Pod
    # 建立一個 pod
    podman pod create --name mypod -p 8080:80
    
    # 在 pod 內跑容器
    podman run -dt --pod mypod nginx
    podman run -dt --pod mypod redis
    

    這樣 nginx 和 redis 就在同一個 Pod 裡,可以共享網路與命名空間。

  3. systemd 整合
    • 這個很方便!
    • 如果你自己弄了容器,要當成背景服務,可以用下列指令自動轉換。
    podman generate systemd --name mycontainer > /etc/systemd/system/mycontainer.service
    

結論

  • 對於用慣 Docker 的人,改用 Podman 好像沒什麼差異,但是對於 安全性 的提高,而且是 Kubernetes 相容 的容器工具。
  • 對開發者來說,上手幾乎零成本。
  • 對企業來說,它帶來更高的安全性與合規性。

上一篇
【Day 18】 SRE 的基礎素養 / 叢集常用的周邊服務
系列文
駕馭商用容器叢集,汪洋漂流術19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言