Podman 作為新一代容器引擎,以其無守護行程的架構和 rootless 執行模式,解決了 Docker 的一些安全和管理上的痛點。尤其在 Kubernetes 環境下,Podman 展現出更佳的相容性和靈活性。本文不僅比較了 Podman 和 Docker 的差異,更深入剖析了 Podman 的架構和核心功能,同時提供了豐富的實戰案例,讓讀者可以快速上手,並將 Podman 整合到現有的 DevOps 流程中,提升容器化應用程式的開發、佈署和管理效率。

Podman 在 DevOps 中的應用:容器化的革新之路

容器技術在現代軟體開發和佈署中扮演著越來越重要的角色。從最初的隔離計算程式到現在廣泛應用於持續整合(CI)、雲端工作負載和微服務,容器技術的發展可謂日新月異。Podman 作為一種新興的容器管理工具,以其獨特的優勢在眾多容器技術中脫穎而出。本文將探討 Podman 在 DevOps 中的應用,並與 Docker 進行比較,分析兩者的優缺點。

容器技術的演進

容器技術的概念最早出現於數十年前,但直到近年來才得到廣泛應用和發展。從最初的簡單程式隔離到現在的複雜應用佈署,容器技術經歷了長足的進步。Docker 的出現使得容器技術變得更加普及,但隨著技術的發展,新的挑戰和需求也隨之而來。

Docker 與 Podman 的比較

Docker 是目前最流行的容器管理工具之一,它簡化了容器映像的建立和分發。然而,隨著容器技術的發展,一些新的需求和挑戰出現了。Podman 作為 Docker 的替代方案,以其無需守護程式、更強的安全性和與 Kubernetes 的更好相容性等特點,吸引了越來越多的關注。

Docker 的優點

  1. 成熟的生態系統:Docker 擁有成熟的生態系統和豐富的資源,包括大量的映像和工具。
  2. 易用性:Docker 的命令列介面和組態檔案使得建立和管理容器變得簡單直觀。

Docker 的缺點

  1. 守護程式的需求:Docker 需要一個守護程式來執行,這增加了系統的複雜性和安全風險。
  2. 安全性問題:Docker 的守護程式以 root 身份執行,這可能帶來安全隱患。

Podman 的優點

  1. 無需守護程式:Podman 不需要守護程式,這減少了系統的複雜性和安全風險。
  2. 更好的安全性:Podman 預設以非 root 身份執行容器,提高了安全性。
  3. 與 Kubernetes 的相容性:Podman 的設計使其與 Kubernetes 更加相容,方便在 Kubernetes 環境中使用。

Podman 的缺點

  1. 相對較新的技術:相比 Docker,Podman 的生態系統還在發展中。
  2. 學習曲線:對於習慣了 Docker 的使用者來說,需要一些時間來適應 Podman。

Podman 的架構與應用

Podman 的架構設計使其具有高度的靈活性和可擴充套件性。它使用 conmon 作為容器的監控工具,並且具有強大的網路功能。瞭解 Podman 的架構有助於更好地使用和管理容器。

Podman 命令詳解

Podman 提供了一系列命令來管理容器和映像。以下是一些常用的 Podman 命令:

# 提取映像
podman pull ubuntu

# 執行容器
podman run -it ubuntu /bin/bash

# 檢視容器列表
podman ps -a

# 停止容器
podman stop <container_id>

# 刪除容器
podman rm <container_id>

內容解密:

  1. podman pull ubuntu:從 Docker Hub 提取 Ubuntu 映像。
  2. podman run -it ubuntu /bin/bash:以互動模式執行 Ubuntu 容器,並進入 Bash shell。
  3. podman ps -a:列出所有容器,包括正在執行和已停止的。
  4. podman stop <container_id>:停止指定的容器。
  5. podman rm <container_id>:刪除指定的容器。

Buildah 與 Podman 的結合使用

Buildah 是用於構建容器映像的工具,它與 Podman 緊密整合。使用 Buildah 可以建立輕量級、可移植的容器映像。

使用 Buildah 構建映像

# 安裝 Buildah
sudo apt-get install buildah

# 建立一個新的構建器
buildah from ubuntu

# 在容器中執行命令
buildah run <container_id> -- apt-get update

# 提交變更
buildah commit <container_id> my-ubuntu-image

內容解密:

  1. buildah from ubuntu:根據 Ubuntu 映像建立一個新的構建器。
  2. buildah run <container_id> -- apt-get update:在容器中執行 apt-get update 命令。
  3. buildah commit <container_id> my-ubuntu-image:將容器的變更提交為一個新的映像 my-ubuntu-image

從理論到實踐:使用 Podman 執行容器

容器技術已經成為現代軟體開發和佈署的核心組成部分。本文將探討容器技術的基本原理,並介紹如何使用 Podman 執行和管理容器。

容器技術簡介

容器是一種輕量級的虛擬化技術,允許在單一主機上執行多個獨立的應用程式。與傳統虛擬機器相比,容器分享相同的核心和作業系統,但具有獨立的檔案系統、網路堆積疊和行程空間。

技術需求

  • 瞭解基本的 Linux 命令列操作
  • 熟悉容器技術的基本概念

什麼是容器?

容器是一種封裝應用程式及其依賴項的方式,使得應用程式可以在不同的環境中一致地執行。容器透過名稱空間和控制群組(cgroups)實作資源隔離和限制。

# 使用 Podman 執行一個簡單的容器
podman run -it ubuntu /bin/bash

內容解密:

  • podman run:使用 Podman 執行一個新容器
  • -it:分配一個偽終端並保持 STDIN 開啟,允許互動式操作
  • ubuntu:指定要使用的容器映像
  • /bin/bash:在容器中執行的命令

Podman 與 Docker 的比較

Podman 是一種無守護程式的容器引擎,與 Docker 相比具有不同的架構和優勢。

Podman 的優勢

  • 無需守護程式,減少安全風險
  • 與 Docker 相容的命令列介面
  • 支援無根容器,提高安全性和靈活性
# 使用 Podman 列出所有正在執行的容器
podman ps

內容解密:

  • podman ps:列出所有正在執行的容器
  • 此命令類別似於 Docker 的 docker ps,但由 Podman 執行

執行第一個容器

使用 Podman 執行容器的第一步是選擇一個作業系統和安裝方法。

選擇作業系統和安裝方法

  • 大多數 Linux 發行版都支援 Podman
  • 可以透過套件管理器(如 dnfapt)安裝 Podman
# 在 Fedora 上安裝 Podman
sudo dnf install podman

內容解密:

  • sudo dnf install podman:使用 dnf 套件管理器安裝 Podman
  • sudo 用於提升許可權以執行安裝操作

管理執行中的容器

Podman 提供了一系列命令來管理執行中的容器,包括檢視日誌、檢查狀態和執行命令。

檢視容器日誌

# 檢視指定容器的日誌
podman logs <container_id>

內容解密:

  • podman logs:檢視指定容器的日誌輸出
  • <container_id>:要檢視日誌的容器的 ID

進一步閱讀

Podman 技術深度解析與實踐

前言

隨著雲原生生態系統的不斷發展,容器技術已成為現代軟體開發和佈署的核心組成部分。作為開發人員、系統管理員和 SRE/維運團隊,瞭解如何實施、構建和管理容器已成為一項必不可少的技能。Podman 及其配套工具 Buildah 和 Skopeo 提供了一套強大的工具集,用於提升容器化應用程式的開發、執行和管理效率。

本文導讀

本文從容器技術的基本概念和底層技術出發,逐步引導讀者使用 Podman 啟動並執行第一個容器。本文探討了完整的工具鏈,涵蓋了新容器的開發、生命週期管理、故障排除和安全等方面。透過本文的學習,讀者將掌握將應用程式構建和封裝到容器中,以及佈署、管理和整合它們與系統服務的能力。

目標讀者群

本文主要針對希望學習如何在容器中構建和封裝應用程式的雲開發人員,以及希望佈署、管理和整合容器與系統服務和協調解決方案的系統管理員。本文還提供了 Podman 與 Docker 的詳細比較,以幫助讀者快速上手 Podman。

本文內容概覽

  1. 容器技術介紹:涵蓋容器技術的關鍵概念、歷史背景以及底層基礎技術。
  2. Podman 與 Docker 比較:分析 Docker 和 Podman 的架構,探討兩者之間的主要差異。
  3. 執行第一個容器:指導讀者如何設定先決條件以使用 Podman 執行和管理第一個容器。
  4. 管理執行中的容器:幫助讀者瞭解如何管理容器的生命週期,包括啟動、停止和終止容器。
  5. 實作容器資料儲存:探討容器的儲存需求、各類別儲存方案及其使用方法。
  6. 使用 Buildah 構建容器:介紹 Buildah 的基本概念,這是 Podman 的配套工具,用於協助系統管理員和開發人員在容器建立過程中。
  7. 與現有應用程式構建流程整合:教授讀者如何將 Buildah 整合到現有應用程式的構建流程中。
  8. 選擇容器基礎映像檔:探討容器基礎映像檔格式、可信來源及其底層特性。
  9. 將映像檔推播到容器註冊中心:指導讀者瞭解容器註冊中心的概念,如何進行身份驗證,以及如何推播和提取映像檔。
  10. 故障排除和監控容器:介紹如何檢查執行中或失敗的容器,搜尋問題,並監控容器的健康狀態。
  11. 安全強化容器:探討容器的安全問題、主要挑戰以及在執行時更新容器映像檔的重要步驟。
  12. 實作容器網路概念:介紹容器網路介面(CNI),如何將容器暴露給外部世界,以及如何在同一台機器上互聯多個容器。
  13. Docker 遷移技巧和竅門:提供從 Docker 遷移到 Podman 的技巧,利用 Podman 的內建功能以及一些有用的技巧來簡化遷移過程。
  14. 與 systemd 和 Kubernetes 互動:展示如何將容器整合為底層作業系統中的系統服務,從而可以使用常見的系統管理員工具進行管理。同時探索 Podman 與 Kubernetes 的互動功能。

如何充分利用本文

本文將引導您完成 Podman 3 或更高版本的安裝和使用,以及其配套工具 Buildah 和 Skopeo。書中使用的預設 Linux 發行版是 Fedora Linux 34 或更高版本,但也可以使用其他 Linux 發行版。所有的命令和程式碼範例都已在 Fedora 34 或 35 和 Podman 3 或 4 上進行了測試,但它們也應該能夠在未來的版本中正常工作。

下載範例程式碼檔案

下載彩色圖片

本文還提供了一份包含螢幕截圖和圖表彩色圖片的 PDF 檔案,您可以下載它以便更清晰地理解相關內容。

結語

透過本文的學習,您將能夠熟練地使用 Podman 來構建、封裝、佈署和管理容器化應用程式,並將它們與系統服務進行整合。無論您是開發人員還是系統管理員,本文都將為您提供寶貴的知識和實踐經驗,以應對日益複雜的雲原生生態系統。

容器技術導論

容器技術在作業系統的歷史中有著悠久的根源。例如,你是否知道容器技術的一部分早在1970年代就已經誕生了?儘管容器技術的實作方式簡單直觀,但背後仍有許多概念值得深入分析,以便完全掌握其在IT產業中的發展歷程。我們將探討這項技術,以更好地理解其內部運作機制、背後的理論基礎以及基本概念。瞭解這些機制和技術將使您能夠輕鬆地掌握整個技術的關鍵概念。

接下來,我們還將探討容器技術的目的以及它為何能夠在當今的每一家公司中得到廣泛應用。你是否知道,目前世界上50%的組織都在生產環境中以容器形式執行其一半以上的應用程式?

讓我們深入探索這項偉大的技術!

在本章中,我們將探討以下問題:

  • 什麼是容器?
  • 為什麼我需要容器?
  • 容器的由來?
  • 容器目前的使用場景?

技術需求

本章不需要任何技術上的先決條件,因此您可以放心閱讀,無需擔心需要在工作站上安裝或設定任何軟體。不過,如果您是容器技術的新手,您將在這裡發現許多有用的技術概念,以便更好地理解後續章節。我們建議您仔細閱讀本章,並在需要時回顧。具備Linux作業系統的相關知識將有助於理解本文所涵蓋的技術概念。

本文的慣例

在後續章節中,我們將透過實務範例學習許多新概念,這些範例需要在Linux shell環境中進行互動。在實務範例中,我們將採用以下慣例:

  • 對於任何以 $ 字元開頭的shell命令,我們將使用Linux系統中的標準使用者(非root使用者)。
  • 對於任何以 # 字元開頭的shell命令,我們將使用Linux系統中的root使用者。
  • 對於輸出或shell命令過長而無法在一行中顯示的情況,我們將使用 \ 字元進行換行。

什麼是容器?

本文將從基礎概念出發,全面描述容器技術,包括行程、檔案系統、系統呼叫、行程隔離,直至容器引擎和執行環境。本文的目的是闡述容器如何實作行程隔離。同時,我們也將說明容器與虛擬機器之間的差異,並強調兩者的最佳應用場景。

在探討什麼是容器之前,我們應該先回答另一個問題:什麼是行程?

內容解密:

這段文字主要闋述了本章的主題和內容安排。首先,它介紹了容器技術的歷史和重要性,接著提出了本章將要探討的問題,包括容器的定義、需求、由來和使用場景。然後,它闡述了本章的技術需求和本文所使用的慣例,最後引出了「什麼是容器」這個核心問題,並對容器的基本概念進行了解釋。

# 使用 $ 字元表示標準使用者
$ podman ps
CONTAINER ID   IMAGE         COMMAND        CREATED         STATUS                    PORTS     NAMES
685a339917e7   registry.fedoraproject.org/f29/httpd:latest   /usr/bin/run-http...   3 minutes ago   Up 3 minutes ago             clever_zhukovsky

內容解密:

這段程式碼展示瞭如何使用 podman ps 命令來列出目前正在執行的容器。其中,podman ps 命令類別似於 Docker 中的 docker ps 命令,用於顯示容器的相關資訊,例如容器ID、使用的映像檔、執行的命令、建立時間、狀態、埠對映和容器名稱等。

# 使用 # 字元表示 root 使用者
# skopeo login -u admin -p p0dman4Dev0ps# --tls-verify=false localhost:5000
Login Succeeded!

內容解密:

這段程式碼展示瞭如何使用 skopeo login 命令登入一個容器登入服務(在本例中為localhost:5000)。其中,-u 引數指定使用者名稱,-p 引數指定密碼,--tls-verify=false 表示不驗證TLS憑證。登入成功後,會顯示 “Login Succeeded!” 的訊息。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Podman 容器技術深度解析與實踐

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

此圖示描述了容器技術的基本組成部分之間的關係,從行程和檔案系統出發,逐步闡述到系統呼叫、行程隔離、容器引擎,直至執行環境,呈現出容器技術的核心架構。

內容解密:

此 Plantuml 圖表清晰地展示了容器技術的核心組成部分之間的邏輯關係。首先,行程與檔案系統和系統呼叫相關聯,然後這兩者共同支援行程隔離的概念。接著,行程隔離進一步與容器引擎相連,最後,容器引擎與執行環境相關聯。這種層層遞進的關係揭示了容器技術從基礎到應用的完整架構。

為什麼需要容器?

容器的出現主要是為瞭解決應用程式佈署和管理的複雜性。透過提供輕量級的虛擬化解決方案,容器允許開發人員將應用程式及其依賴項封裝在一起,從而實作跨不同環境的一致性和可移植性。

內容解密:

這段文字主要解釋了容器的需求背景。隨著應用程式變得越來越複雜,其佈署和管理也變得越來越具有挑戰性。容器技術透過提供一種輕量級的虛擬化方式,有效地解決了這些問題。它使得開發人員能夠將應用程式和其所需的依賴項封裝成一個獨立的單元,從而確保應用程式在不同環境中的一致性和可移植性。

總而言之,本章介紹了容器技術的基本概念、歷史背景以及它在現代IT產業中的重要性。同時,也提出了一些有關容器的基本問題,並對這些問題進行了解答。透過本章的學習,讀者可以對容器技術有一個全面而深入的瞭解。

容器技術導論

容器技術是一種應用程式隔離的形式,能夠在多個層面上提供隔離環境。根據《The Linux Programming Interface》一書的描述,行程(process)是執行中的程式例項,而程式則是包含執行行程所需資訊的檔案。行程在機器的使用者空間中例項化,其執行由作業系統核心(kernel)協調。當行程需要存取不同的機器資源(如I/O、記憶體等)時,它會對核心空間進行系統呼叫。

容器的基本概念

容器是一種簡單而聰明的解決方案,用於執行隔離的行程例項。容器提供了多種隔離機制,包括:

  • 檔案系統隔離:容器化的行程具有獨立的檔案系統檢視,其程式從隔離的檔案系統中執行。
  • 行程ID隔離:容器化的行程在獨立的行程ID(PID)空間中執行。
  • 使用者隔離:使用者ID(UID)和群組ID(GID)在容器內部被隔離,行程的UID和GID可以在容器內部與外部不同。
  • 網路隔離:容器提供對主機網路資源(如網路裝置、IPv4和IPv6協定堆積疊、路由表和防火牆規則)的隔離。
  • IPC隔離:容器提供對主機IPC資源(如POSIX訊息佇列或System V IPC物件)的隔離。
  • 資源使用隔離:容器依賴Linux控制群組(cgroups)來限制或監控特定資源(如CPU、記憶體或磁碟)的使用。

容器的優勢

容器提供了一種一致的隔離層,確保應用程式及其相關依賴項能夠在同一主機上無縫共存。新的佈署只需執行新的容器化版本,而不會與其他容器或本機應用程式產生衝突或互動。

Linux名稱空間

Linux容器由不同的原生核心功能啟用,其中最重要的是Linux名稱空間。名稱空間抽象了特定的系統資源,使其看起來像是隔離行程所獨有的。目前,共有八種名稱空間:

  • PID名稱空間:隔離行程ID號碼,允許不同PID名稱空間中的行程保留相同的PID。
  • 使用者名稱空間:隔離使用者和群組ID、根目錄、金鑰環和許可權。
  • UTS名稱空間:允許隔離主機名和NIS網域名稱。
  • 網路名稱空間:允許隔離網路系統資源,如網路裝置、IPv4和IPv6協定堆積疊、路由表、防火牆規則和埠號等。
  • IPC名稱空間:隔離IPC資源,如System V IPC物件和POSIX訊息佇列。
  • cgroup名稱空間:隔離cgroup目錄,提供行程cgroups的虛擬檢視。
  • 掛載名稱空間:提供掛載點列表的隔離,允許行程在名稱空間中看到不同的掛載點列表。
  • 時間名稱空間:提供系統時間的隔離檢視,允許名稱空間中的行程以與主機時間不同的時間偏移執行。

資源使用與cgroups

cgroups是Linux核心的原生功能,用於將行程組織成層次樹,並限制或監控其資源使用。核心cgroups介面透過cgroupfs偽檔案系統暴露,通常掛載在主機上的/sys/fs/cgroup下。cgroups提供了一系列控制器(也稱為子系統),可用於不同的目的,如限制行程的CPU時間份額、記憶體使用量、凍結和還原行程等。

cgroups的使用範例

以下是一個使用cgroups限制行程CPU使用率的範例:

# 建立一個名為"my_cgroup"的cgroup
sudo cgcreate -g cpu:my_cgroup

# 設定"my_cgroup"的CPU使用率限制為50%
sudo cgset -r cpu.shares=512 my_cgroup

# 在"my_cgroup"中執行一個行程
sudo cgexec -g cpu:my_cgroup stress -c 1

內容解密:

  1. cgcreate指令用於建立一個新的cgroup,-g選項指定了要建立的cgroup的名稱和控制器型別。在這個範例中,我們建立了一個名為"my_cgroup"的cgroup,並指定了cpu控制器。
  2. cgset指令用於設定cgroup的引數,-r選項指定了要設定的引數名稱和值。在這個範例中,我們設定了cpu.shares引數為512,這表示"my_cgroup"中的行程將獲得CPU時間的50%。
  3. cgexec指令用於在指定的cgroup中執行一個行程,-g選項指定了要使用的cgroup名稱。在這個範例中,我們在"my_cgroup"中執行了一個stress行程,該行程將佔用一個CPU核心。