Docker Vs Podman

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

docker vs podman

容器化的一場全新革命是從 Docker 開始的,Docker 的守護進程管理着全部的事情,併成爲最受歡迎和普遍使用的容器管理系統之一。安全

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

這篇博文將幫助您瞭解如下問題:網絡

爲何咱們不使用 Docker? 爲何咱們要使用 Docker? 沒有別的選擇了嗎?其實,當您決定要開始使用一套新的工具進行容器管理時,Docker 便成了「別的」工具,此時沒有了 「docker containers/images」,只有 「containers/images」。curl

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

Docker 是什麼?

Docker 是一個容器化平臺,在這個平臺中,咱們能夠將咱們的應用程序與容器中的庫和環境綁定在一塊兒。 Docker Container 在某種程度上相似於虛擬機。
可是……工具

與硬件虛擬化的虛擬機不一樣,在 Docker 中,運行中的容器共享主機 OS 內核。測試

Containers VS VMs

Docker 是如何工做的呢?讓咱們來看一下:url

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 相關的問題 三、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 ↩︎

相關文章
相關標籤/搜索