用 Podman Compose 管理容器
容器很棒,讓你可以將你的應用連同其依賴項一起打包,并在任何地方運行。從 2013 年的 Docker 開始,容器已經(jīng)讓軟件開發(fā)者的生活變得更加輕松。
Docker 的一個缺點是它有一個中央守護進程,它以 root 用戶的身份運行,這對安全有影響。但這正是 Podman 的用武之地。Podman 是一個 無守護進程容器引擎,用于開發(fā)、管理和在你的 Linux 系統(tǒng)上以 root 或無 root 模式運行 OCI 容器。
下面這些文章可以用來了解更多關(guān)于 Podman 的信息:
如果你使用過 Docker,你很可能也知道 Docker Compose,它是一個用于編排多個可能相互依賴的容器的工具。要了解更多關(guān)于 Docker Compose 的信息,請看它的文檔。
什么是 Podman Compose?
Podman Compose 項目的目標是作為 Docker Compose 的替代品,而不需要對 docker-compose.yaml 文件進行任何修改。由于 Podman Compose 使用吊艙 工作,所以最好看下“吊艙”的最新定義。
一個“吊艙 ”(如一群鯨魚或豌豆莢)是由一個或多個容器組成的組,具有共享的存儲/網(wǎng)絡(luò)資源,以及如何運行容器的規(guī)范。
(LCTT 譯注:容器技術(shù)領(lǐng)域大量使用了航海比喻,pod 一詞,意為“豆莢”,在航海領(lǐng)域指“吊艙” —— 均指盛裝多個物品的容器。常不翻譯,考慮前后文,可譯做“吊艙”。)
Podman Compose 的基本思想是,它選中 docker-compose.yaml 文件里面定義的服務(wù),為每個服務(wù)創(chuàng)建一個容器。Docker Compose 和 Podman Compose 的一個主要區(qū)別是,Podman Compose 將整個項目的容器添加到一個單一的吊艙中,而且所有的容器共享同一個網(wǎng)絡(luò)。如你在例子中看到的,在創(chuàng)建容器時使用 --add-host 標志,它甚至用和 Docker Compose 一樣的方式命名容器。
安裝
Podman Compose 的完整安裝說明可以在項目頁面上找到,它有幾種方法。要安裝最新的開發(fā)版本,使用以下命令:
pip3 install https://github.com/containers/podman-compose/archive/devel.tar.gz
確保你也安裝了 Podman,因為你也需要它。在 Fedora 上,使用下面的命令來安裝Podman:
sudo dnf install podman
例子:用 Podman Compose 啟動一個 WordPress 網(wǎng)站
想象一下,你的 docker-compose.yaml 文件在一個叫 wpsite 的文件夾里。一個典型的 WordPress 網(wǎng)站的 docker-compose.yaml (或 docker-compose.yml) 文件是這樣的:
version: "3.8"services:web:image: wordpressrestart: alwaysvolumes:- wordpress:/var/www/htmlports:- 8080:80environment:WORDPRESS_DB_HOST: dbWORDPRESS_DB_USER: magazineWORDPRESS_DB_NAME: magazineWORDPRESS_DB_PASSWORD: 1maGazine!WORDPRESS_TABLE_PREFIX: czWORDPRESS_DEBUG: 0depends_on:- dbnetworks:- wpnetdb:image: mariadb:10.5restart: alwaysports:- 6603:3306volumes:- wpdbvol:/var/lib/mysqlenvironment:MYSQL_DATABASE: magazineMYSQL_USER: magazineMYSQL_PASSWORD: 1maGazine!MYSQL_ROOT_PASSWORD: 1maGazine!networks:- wpnetvolumes:wordpress: {}wpdbvol: {}networks:wpnet: {}
如果你用過 Docker,你就會知道你可運行 docker-compose up 來啟動這些服務(wù)。Docker Compose 會創(chuàng)建兩個名為 wpsite_web_1 和 wpsite_db_1 的容器,并將它們連接到一個名為 wpsite_wpnet 的網(wǎng)絡(luò)。
現(xiàn)在,看看當你在項目目錄下運行 podman-compose up 時會發(fā)生什么。首先,一個以執(zhí)行命令的目錄命名的吊艙被創(chuàng)建。接下來,它尋找 YAML 文件中定義的任何名稱的卷,如果它們不存在,就創(chuàng)建卷。然后,在 YAML 文件的 services 部分列出的每個服務(wù)都會創(chuàng)建一個容器,并添加到吊艙中。
容器的命名與 Docker Compose 類似。例如,為你的 web 服務(wù)創(chuàng)建一個名為 wpsite_web_1 的容器。Podman Compose 還為每個命名的容器添加了 localhost 別名。之后,容器仍然可以通過名字互相解析,盡管它們并不像 Docker 那樣在一個橋接網(wǎng)絡(luò)上。要做到這一點,使用選項 -add-host。例如,-add-host web:localhost。
請注意,docker-compose.yaml 包含了一個從主機 8080 端口到容器 80 端口的 Web 服務(wù)的端口轉(zhuǎn)發(fā)。現(xiàn)在你應該可以通過瀏覽器訪問新 WordPress 實例,地址為 http://localhost:8080。
WordPress Dashboard
控制 pod 和容器
要查看正在運行的容器,使用 podman ps,它可以顯示 web 和數(shù)據(jù)庫容器以及吊艙中的基礎(chǔ)設(shè)施容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa364a8d7cec7 docker.io/library/wordpress:latest apache2-foregroun... 2 hours ago Up 2 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:6603->3306/tcp wpsite_web_1c447024aa104 docker.io/library/mariadb:10.5 mysqld 2 hours ago Up 2 hours ago 0.0.0.0:8080->80/tcp, 0.0.0.0:6603->3306/tcp wpsite_db_112b1e3418e3e k8s.gcr.io/pause:3.2
你也可以驗證 Podman 已經(jīng)為這個項目創(chuàng)建了一個吊艙,以你執(zhí)行命令的文件夾命名。
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS8a08a3a7773e wpsite Degraded 2 hours ago 12b1e3418e3e 3
要停止容器,在另一個命令窗口中輸入以下命令:
podman-compose down
你也可以通過停止和刪除吊艙來實現(xiàn)。這實質(zhì)上是停止并移除所有的容器,然后再刪除包含的吊艙。所以,同樣的事情也可以通過這些命令來實現(xiàn):
podman pod stop podnamepodman pod rm podname
請注意,這不會刪除你在 docker-compose.yaml 中定義的卷。所以,你的 WordPress 網(wǎng)站的狀態(tài)被保存下來了,你可以通過運行這個命令來恢復它。
podman-compose up
總之,如果你是一個 Podman 粉絲,并且用 Podman 做容器工作,你可以使用 Podman Compose 來管理你的開發(fā)和生產(chǎn)中的容器。



























