Docker Vs Podman

技術譯民發表於2020-11-30

翻譯自 Chetansingh 2020年4月24日的博文《Docker Vs Podman》 [1]

docker vs podman

容器化的一場全新革命是從 Docker 開始的,Docker 的守護程式管理著所有的事情,併成為最受歡迎和廣泛使用的容器管理系統之一。

但是,請稍等!您真的會假設 Docker 是唯一有效的容器化方式而認為值得堅持去使用它嗎?

這篇博文將幫助您瞭解以下問題:

為什麼我們不使用 Docker? 為什麼我們要使用 Docker? 沒有別的選擇了嗎?其實,當您決定要開始使用一套新的工具進行容器管理時,Docker 便成了“別的”工具,此時沒有了 “docker containers/images”,只有 “containers/images”。

在繼續討論本文內容之前,讓我們先來了解一下 Docker 是什麼以及它是如何工作的。

Docker 是什麼?

Docker 是一個容器化平臺,在這個平臺中,我們可以將我們的應用程式與容器中的庫和環境繫結在一起。 Docker Container 在某種程度上類似於虛擬機器。
但是……

與硬體虛擬化的虛擬機器不同,在 Docker 中,執行中的容器共享主機 OS 核心。

Containers VS VMs

Docker 是如何工作的呢?讓我們來看一下:

Docker 流程:

Docker Flow

Docker 的兩個主要組成模組是: Docker DaemonDocker CLI

請允許我簡短地解釋一下:

Docker Daemon: 一個常駐的後臺程式,幫助管理和建立 Docker 映象、容器、網路和儲存卷。

Docker Engine REST API: 一個應用程式用來與 Docker 守護程式進行互動的 API; 可以通過 HTTP 客戶端訪問它。

Docker CLI: 一個用來與 Docker 守護程式進行互動的 Docker 命令列客戶端,也就是 Docker 命令。

如果換個角度思考,我們可以把下面這些問題與 Docker 聯絡起來:

  1. 眾所周知,Docker 執行在單個程式上,這可能會導致單點故障。
  2. 所有子程式都歸屬於此程式。
  3. 無論何時,如果 Docker 守護程式失敗,所有子程式都會失去跟蹤並進入孤立狀態。
  4. 安全漏洞。
  5. 對於 Docker 的操作,所有步驟都需要由 root 執行。

Podman

現在我們知道了 Docker 是如何工作的,下面我們來探討有關 Podman 的主題,以及我們如何克服與 Docker 相關的大多數問題。

此時,您一定想了解“Podman 是什麼?

  • Podman 是一個無守護程式的容器引擎,用於在 Linux 系統上進行開發、管理和執行 OCI Containers。 Containers 能以 root 模式執行,也能以非 root 模式執行。

Podman

  • Podman 直接與映象登錄檔、容器和映象儲存進行互動。
  • 我們知道,Docker 是建立在 runC 容器執行時之上 [2],並且使用了守護程式的; Podman 中沒有使用守護程式,而是直接使用 runC 容器執行時。

譯者注:
Podman 沒有守護程式,也不用 REST API 互動,可以使用非 root 模式執行,這便解決了上面提到的 與 Docker 相關的問題 3、4 和 5。

關於 Podman,有幾件事需要重點了解一下:

  • Podman 不需要啟動或管理像 Docker daemon 那樣的守護程式。
  • 適用於 Docker 的命令在 Podman 中也是同樣可用的。您可以指定命令別名:alias docker=podman
  • Podman 和 Docker 的映象具有相容性。

很酷……不是嗎?

Podman 入門

安裝 podman

在 CentOS 8 上安裝 podman:

[cloudbunny@technopanti ~]$ yum install podman

install podman

安裝 podman 之後,您可以使用下面命令檢查版本:

[cloudbunny@technopanti ~]$ podman --version

輸出:podman version 2.1.1

執行一個示例容器

[cloudbunny@technopanti ~]$ podman run -dt -p 8080:8080/tcp -e HTTPD_VAR_RUN=/var/run/httpd -e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \
-e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \
-e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/ \
registry.fedoraproject.org/f29/httpd /usr/bin/run-httpd

Running a sample container

由於在 podman run 命令中 -d 表示以分離模式執行容器,因此 Podman 將在容器執行後列印出容器 ID。注意,這裡我們使用了埠轉發來訪問容器內的 HTTP server。

註釋:

  1. -d 表示以分離模式在後臺執行此容器。
  2. Podman 在後臺執行後會列印出容器 ID。(例如:f1f7215ccf26fe7bb83dd108cdb41480aae5794058a007dd85a098af0d390563)
  3. -p: 利用埠轉發,使能夠訪問容器內的 HTTP server。

列出執行中的容器

[cloudbunny@technopanti ~]$ podman ps

Listing running containers

檢查執行中的容器

[cloudbunny@technopanti ~]$ podman inspect -l

這將有助於“檢查”正在執行的容器中的後設資料和相關的詳細資訊 —— 狀態(執行或停止)、建立日期和容器 ID,等等。

Inspecting a running container

既然我們有容器的詳細資訊,我們便可以測試 http server,此例中,在埠 8080 上執行埠轉發。
執行命令:

[cloudbunny@technopanti ~]$ curl http://localhost:8080

上面的命令將會顯示我們容器化的 httpd server 中的 index 頁面。

curl http://localhost:8080

檢視容器日誌

[cloudbunny@technopanti ~]$ podman logs --latest

希望您享受本文的閱讀 ?


作者 : Chetansingh
譯者 : 技術譯民
出品 : 技術譯站
連結 : 英文原文


  1. https://medium.com/technopanti/docker-vs-podman-c03359fabf77 Docker Vs Podman ↩︎

  2. https://www.docker.com/blog/runc/ Introducing runC ↩︎

相關文章