如何使用 Podman 建立容器?


如今,我們經常聽到 **容器** 和 **虛擬機器 (VM)** 這些術語,如果你是一個初學者,很難區分這些術語以及功能相似、幾乎做同樣工作的技術。

在本篇綜合教程中,我們將以簡單易懂的方式解釋 **什麼是容器**、**什麼是容器引擎**,最後,我們將安裝並使用 **Podman** 作為容器技術來執行我們的第一個容器。

什麼是容器?

要理解什麼是容器,讓我們舉個例子,假設我們有一個使用 PHP 版本 8 的應用程式。每個版本都有自己的庫和依賴項。我們需要在我們的機器上下載並安裝所有這些內容,這沒有問題。接下來,我們有一個使用不同版本的另一個應用程式,它與第一個應用程式完全不同,使用它自己的庫和二進位制檔案。現在,如果我們嘗試下載這些軟體包,我們會收到錯誤訊息,因為我們在第一個應用程式中已經有了相同但版本不同的軟體包,從而導致名為 **版本不匹配** 的錯誤,並且會遇到很多麻煩。

為了解決這個問題,我們可以將應用程式分開,每個應用程式放在它自己的資料夾中,並帶有它自己的庫和依賴項,但這在操作上並不實用。

第二個解決方案是使用虛擬機器 (VM),因此我們在單獨的虛擬機器中設定每個應用程式,首先設定作業系統,然後設定應用程式所需的 PHP 和其他依賴項。對於另一個應用程式,我們也執行相同的操作,總共要執行兩個應用程式,我們需要設定兩個虛擬機器,每個虛擬機器都有自己的資源。這在成本方面令人討厭且昂貴。這種方法運行了一段時間,直到我們有了現在所謂的容器。

因此,容器在這裡提供的解決方案是,我們獲取第一個應用程式及其自己的庫和依賴項,將其放入容器(盒子)本身,給這個盒子命名,並將其儲存到某個位置。我們可以將其帶到任何作業系統並執行它,沒有任何問題,因為它與作業系統隔離;我們只需要為它設定環境。

我們需要設定的環境就是我們所說的 **容器執行時環境**。

請檢視此插圖,以瞭解我們目前所處的階段 -

這個執行時環境是為容器提供其正常執行所需的一切的層。只要此層存在,容器(我們的盒子)就能在任何地方或任何我們使用的作業系統上都能正常工作,這並不重要。即使硬體也不重要,除了體系結構之外。

例如,我們不能將使用 x86_64 體系結構構建的內容拿到樹莓派上執行,因為體系結構不同。否則,我們可以做任何我們想做的事情;唯一需要的是相同的體系結構。

現在問題是,這個執行時環境究竟是什麼?如果您還記得我們之前說過的話,當我們需要使用虛擬機器設定一個新的應用程式時,我們首先設定作業系統,然後安裝應用程式執行所需的所有依賴項。好吧,當我們執行應用程式時,這個執行時也會做同樣的事情,就像它在作業系統內部執行一樣。

好的,現在我們瞭解了這一層是如何工作的,但它最初是如何構建的呢?

容器在後臺是如何工作的?

在 Linux 中,我們有一些叫做 **名稱空間** 的東西,您可以將其想象成監獄。任何進入這個“監獄”的東西都無法出去;應用程式也是如此。如果我們在這個名稱空間中執行它,它就無法出去,並且與外部隔離。

容器使用的另一項功能是 **cgroups**,這是另一個 Linux 概念,它基本上允許我們控制容器內程序使用的資源。因此,使用 cgroups,我們可以為容器設定資源。

容器使用的另一個重要概念是 **SELinux**,它允許我們控制容器的安全性和訪問許可權。

還有其他部分,但現在,我們可以只關注這三個部分(Linux 名稱空間、cgroups、SELinux)並瞭解每個部分的作用。

容器和微服務

讓我們再舉一個例子,假設我們有一個包含許多部分和服務的應用程式。在容器出現之前,我們會將所有這些部分放在一個虛擬機器中執行。但是,如果出現問題,我們必須測試整個應用程式才能找到它。我們將此操作稱為故障排除,這很難,因為我們不知道問題的確切位置,因此我們檢查整個應用程式。

另一個痛苦的操作是,如果我們對某一部分進行了一些修改,我們需要檢查整個應用程式以確保我們所做的更改有效,因為所有內容都是相互關聯的。我們需要確保我們所做的更改對應用程式的其餘部分是正確的。

現在,為了解決這個問題,容器的作用是允許我們將應用程式的每個部分分離到一個單獨的容器中獨立執行。這使得故障排除更容易,因為如果一個容器(在本例中為服務)出現問題,我們可以直接轉到它並修復它,而無需依賴其他容器。如果我們對應用程式的一部分進行了更改,我們只需要測試負責該部分的容器,而不是整個應用程式。

我們將這種分離容器和服務的運作稱為微服務,這意味著每個服務都在它自己的容器中。下圖顯示了它是如何工作的

在此示例中,我們有兩個不同的應用程式在執行時環境中執行,每個應用程式都有自己的服務。

容器和擴充套件

讓我們再看一個場景,假設我們有一個正在執行的應用程式,在某個時刻,我們進行了一次促銷活動,導致許多使用者湧入我們的應用程式。這可能會導致問題,因為應用程式的設定無法為所有使用者提供服務。為了解決這個問題,我們需要建立更多虛擬機器來處理高流量,這些虛擬機器將包含所有二進位制檔案和程式碼。為了演示這一點,讓我們看這個插圖。

讓我們理解這個例子:我們有兩個虛擬機器執行我們的應用程式,因為我們獲得了大量流量,所以我們透過新增另一個虛擬機器來擴充套件。

這會佔用大量資源;在某些情況下,應用程式本身可能很小,但要執行它,您需要一個消耗大量資源的虛擬機器。隨著我們不斷發展和流量增加,我們可能會耗盡機器資源,此時我們需要另一臺機器,等等。

您可能會看到一個名為 Hypervisor 的層,我們沒有解釋。基本上,這一層允許我們在我們的主機器上執行虛擬機器。

如果您注意到此示例中,為了擴充套件應用程式,我們擴充套件了整個應用程式,這毫無用處。使用微服務架構,如果我們有一個包含許多元件的應用程式,我們可能只需要擴充套件流量較大的部分,而不是整個應用程式。

如果我們使用容器,我們可以做到這一點,因為正如我們之前所說,每個元件都在一個單獨的容器中。我們只需要獲取流量較大的元件並擴充套件它。

容器引擎

既然您已經瞭解了我們為什麼需要容器以及它是如何工作的,那麼讓我們學習如何在我們的機器上使用容器技術。為了實現這一點,您需要我們所說的容器引擎。

有許多容器引擎平臺允許我們執行容器,其中一個您可能聽說過的是 Docker,這是一個流行且廣泛使用的平臺。但在我們的教程中,我們將使用另一個名為 **Podman** 的平臺,它與 Docker 類似,但具有更多功能和能力。

結論

本文是對容器技術的介紹,包括它在 Linux 上的工作原理以及您應該瞭解哪些內容才能輕鬆地使用它。

更新於: 2024年11月21日

瀏覽量 1 次

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.