Docker Vs Podman

翻譯自 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 //localhost:8080

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

curl //localhost:8080

查看容器日誌

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

希望您享受本文的閱讀 😃

作者 : Chetansingh
譯者 : 技術譯民
出品 : 技術譯站
鏈接 : 英文原文


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

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