注意:
- 本教學課程位於 Oracle 提供的免費實驗室環境。
- 它會使用 Oracle Cloud Infrastructure 證明資料、租用戶及區間的範例值。完成實驗室時,請將這些值替代為您雲端環境特定的值。
使用 Podman 編寫檔案
簡介
Docker Compose 是一種命令行工具,使用特殊格式的 YAML 檔案作為輸入來組合,然後執行單一或多個容器作為應用程式。這可讓開發者針對其應用程式開發、測試及傳遞單一 YAML 檔案給使用者,並且只使用一個命令來加以啟動及停止。這個可攜性與可靠性使得 Docker Compose 不僅在使用者和開發人員都廣為受歡迎,而且越來越需要。
目標
這個實驗室說明如何安裝和使用 podman-compose
和 docker-compose
搭配 Podman,並驗證是否使用簡單的 docker-compose.yaml
檔案。
必要條件
- 安裝 Oracle Linux 的用戶端系統
- 已安裝 Podman ('container-tools' 套件)
- 存取網際網路
Oracle Support 免責聲明
Oracle 不會針對下列指示所提供的步驟順序提供技術支援,因為這些步驟是指並非由 Oracle 提供的軟體程式和作業系統。本教學課程提供選擇性指示,僅供參考。
如需 Oracle 支援開發及使用 Podman 型服務的方法的詳細資訊,請參閱 https://docs.oracle.com/en/operating-systems/oracle-linux/podman/。
設定實驗室環境
注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以瞭解連線和其他用途指示。
-
開啟終端機,如果尚未連線,則透過 ssh 連線到 ol-server 執行處理。
ssh oracle@<ip_address_of_instance>
確認 Podman 工作
Oracle Linux 中的容器工具套件提供最新的 Podman、Buildah、Skopeo 及相關相依性版本。
-
檢查 Podman 的版本。
podman -v
-
確認 Podman CLI 正在運作中。
podman run quay.io/podman/hello
範例輸出:
[oracle@ol-server ~]$ podman run quay.io/podman/hello Trying to pull quay.io/podman/hello:latest... Getting image source signatures Copying blob f82b04e85914 done Copying config dbd85e09a1 done Writing manifest to image destination Storing signatures !... Hello Podman World ...! .--"--. / - - \ / (O) (O) \ ~~~| -=(,Y,)=- | .---. /` \ |~~ ~/ o o \~~~~.----. ~~ | =(X)= |~ / (O (O) \ ~~~~~~~ ~| =(Y_)=- | ~~~~ ~~~| U |~~ Project: https://github.com/containers/podman Website: https://podman.io Documents: https://docs.podman.io Twitter: @Podman_io
設定 Podman 以使用編寫檔案
Podman 在 Podman v3.2.0 中導入了 Docker Compose 功能的支援,但 Podman v3.0.0 中已引進有限的支援,因此能夠從 Podman 內使用 Docker Compose 。最近的 Podman v4.1.0 擴充了 Docker Compose 功能的支援,包括使用 Docker Compose v2.2 和更新版本。
下列步驟說明如何安裝與配置 podman-compose
和 docker-compose
。
安裝 Podman Docker 套裝程式
這可讓 Podman 以原生方式使用 Docker 命令。
-
安裝
podman-docker
套裝軟體。sudo dnf install -y podman-docker
安裝 Docker Compose
注意:
如此處所述,以獨立方式安裝需要使用
docker-compose
,而非使用docker compose
的 Docker 公用程式時使用的標準語法。換句話說,請以docker-compose up
取代docker compose up
語法。
-
下載並安裝獨立的 Compose。
sudo curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
範例輸出:
[oracle@ol-server ~]$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 42.8M 100 42.8M 0 0 158M 0 --:--:-- --:--:-- --:--:-- 158M
-
在二進位檔套用執行檔權限 。
sudo chmod +x /usr/local/bin/docker-compose
-
確認撰寫獨立工作。
docker-compose version
範例輸出:
[oracle@ol-server ~]$ docker-compose version Docker Compose version v2.15.1
啟動 Podman 通訊埠
若要讓 Docker Compose 功能透過建立 Unix 通訊埠運作,必須執行下列步驟。
-
使用下列步驟設定 Podman 通訊埠。
sudo systemctl enable --now podman.socket sudo systemctl status podman.socket
範例輸出:
[oracle@ol-server ~]$ sudo systemctl enable --now podman.socket Created symlink /etc/systemd/system/sockets.target.wants/podman.socket -> /usr/lib/systemd/system/podman.socket. [oracle@ol-server ~]$ sudo systemctl status podman.socket * podman.socket - Podman API Socket Loaded: loaded (/usr/lib/systemd/system/podman.socket; enabled; vendor preset) Active: active (listening) since Thu 2023-01-19 20:58:20 GMT; 16s ago Docs: man:podman-system-service(1) Listen: /run/podman/podman.sock (Stream) CGroup: /system.slice/podman.socket Jan 19 20:58:20 ol-server systemd[1]: Listening on Podman API Socket.
-
使用 curl 驗證插槽是否如預期般運作。
sudo curl -w "\n" -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
範例輸出:
[oracle@ol-server ~]$ sudo curl -w "\n" -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping OK [oracle@ol-server ~]$
如果此指令的輸出傳回 OK
,則已成功將「撰寫」功能設定為使用 docker-compose.yaml 檔案。
安裝 Podman Compose
Podman Compose 是 Python 3 程式庫,它實行了使用 Podman 執行的組合規格。
-
安裝 Podman Compose 之前,請先確認已將管線更新為最新版本。
sudo -H pip3 install --upgrade pip
-
安裝 Podman Compose 套裝程式。
sudo pip3 install podman-compose
將
pip3 install
執行為sudo
時,可以忽略 WARNING 訊息。 -
確認 Podman Compose 運作。
podman-compose version
範例輸出:
[oracle@ol-server ~]$ podman-compose version ['podman', '--version', ''] using podman version: 4.2.0 podman-composer version 1.0.3 podman --version podman version 4.2.0 exit code: 0
建立 Docker 編寫檔案
這個 docker-compose.yaml 檔案可讓您提取和啟動指定的應用程式。
-
建立測試目錄。
mkdir -p Documents/examples/echo
-
變更成目錄。
cd Documents/examples/echo
-
建立 docker-compose.yaml 檔案。
cat >> docker-compose.yaml << EOF --- version: '3' services: web: image: k8s.gcr.io/echoserver:1.4 ports: - "${HOST_PORT:-8080}:8080" EOF
-
檢閱剛剛建立的 docker-compose.yaml。
cat docker-compose.yaml
範例輸出:
[oracle@ol-server echo]$ cat docker-compose.yaml --- version: '3' services: web: image: k8s.gcr.io/echoserver:1.4 ports: - "8080:8080"
確認 Podman Compose 正在運作中
-
變更至 docker-compose 檔案所在的目錄。
重要:除非您位於
docker-compose.yaml
檔案所在的目錄中,否則podman-compose
指令無法運作。cd ~/Documents/examples/echo/
-
啟動
echoserver
應用程式。podman-compose up -d
範例輸出:
[oracle@ol-server echo]$ podman-compose up -d ['podman', '--version', ''] using podman version: 4.2.0 ** excluding: set() ['podman', 'network', 'exists', 'echo_default'] ['podman', 'network', 'create', '--label', 'io.podman.compose.project=echo', '--label', 'com.docker.compose.project=echo', 'echo_default'] ['podman', 'network', 'exists', 'echo_default'] podman create --name=echo_web_1 --label io.podman.compose.config-hash=123 --label io.podman.compose.project=echo --label io.podman.compose.version=0.0.1 --label com.docker.compose.project=echo --label com.docker.compose.project.working_dir=/home/oracle/examples/echo --label com.docker.compose.project.config_files=docker-compose.yaml --label com.docker.compose.container-number=1 --label com.docker.compose.service=web --net echo_default --network-alias web -p 8080:8080 k8s.gcr.io/echoserver:1.4 Trying to pull k8s.gcr.io/echoserver:1.4... Getting image source signatures Copying blob d3c51dabc842 done Copying blob a3ed95caeb02 done Copying blob 6d9e6e7d968b done Copying blob 412c0feed608 done Copying blob cd23f57692f8 done Copying blob dcd34d50d5ee done Copying blob a3ed95caeb02 skipped: already exists Copying blob a3ed95caeb02 skipped: already exists Copying blob a3ed95caeb02 skipped: already exists Copying blob b4241160ce0e done Copying blob 7abee76f69c0 done Writing manifest to image destination Storing signatures 1b54b75ca13786d33df6708da1d83ecce14b055e78b03007c3c4e1f441e7139c exit code: 0
注意:就像 Podman 一樣,只有在系統上尚未有
docker-compose.yaml
檔案中參照的任何容器才會被提取。 -
測試
echoserver
應用程式是否已啟動並在執行中。curl -X POST -d "foobar" http://localhost:8080/; echo
範例輸出:
[oracle@ol-server echo]$ curl -X POST -d "foobar" http://localhost:8080/; echo CLIENT VALUES: client_address=10.89.0.2 command=POST real path=/ query=nil request_version=1.1 request_uri=http://localhost:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* content-length=6 content-type=application/x-www-form-urlencoded host=localhost:8080 user-agent=curl/7.61.1 BODY: foobar
-
審核日誌以確認成功。
podman-compose logs
範例輸出:
[oracle@ol-server echo]$ podman-compose logs ['podman', '--version', ''] using podman version: 4.2.0 podman logs echo_web_1 10.89.0.2 - - [17/Jan/2023:12:46:47 +0000] "POST / HTTP/1.1" 200 446 "-" "curl/7.61.1" exit code: 0
-
使用 Podman Compose 公用程式可查看執行中的容器。
podman-compose ps
範例輸出:
[oracle@ol-server echo]$ podman-compose ps ['podman', '--version', ''] using podman version: 4.2.0 podman ps -a --filter label=io.podman.compose.project=echo CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f4053947c8c1 k8s.gcr.io/echoserver:1.4 nginx -g daemon o... 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->8080/tcp echo_web_1 exit code: 0
注意:請執行
podman-compose --help
,查看其他 Podman Compose 公用程式指令。不過,此實驗室的這些額外命令已超出範圍。 -
現在是時候停止 echoweb 服務了。
podman-compose down
確認 Docker Compose 正在運作中
-
(可選擇) 變更至 docker-compose 檔案所在的目錄。
重要:除非您位於
docker-compose.yaml
檔案所在的目錄中,否則docker-compose
指令無法運作。cd ~/Documents/examples/echo/
-
啟動
echoserver
應用程式。sudo /usr/local/bin/docker-compose up -d
範例輸出:
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose up -d [+] Running 0/0 [+] Running 0/1echo-web-1 Starting 0.0 [+] Running 0/1echo-web-1 Starting 0.1 [+] Running 0/1echo-web-1 Starting 0.2 [+] Running 0/1echo-web-1 Starting 0.3 [+] Running 0/1echo-web-1 Starting 0.4 [+] Running 0/1echo-web-1 Starting 0.5 [+] Running 0/1echo-web-1 Starting 0.6 [+] Running 0/1echo-web-1 Starting 0.7 [+] Running 1/1echo-web-1 Starting 0.8 ��� Container echo-web-1 Started 0.8s
注意:
執行此指令時如果傳回下列輸出:
��� Container echo-web-1 Starting 0.9s Error response from daemon: cannot listen on the TCP port: listen tcp4 :8080: bind: address already in use
不用擔心,這只表示未執行
podman-compose down
指令,而且先前使用podman-compose
啟動的 echoserver 容器仍在執行中。依照先前的步驟停止。 -
測試容器正在執行中。
curl -X POST -d "foobar" http://localhost:8080/; echo
範例輸出:
[oracle@ol-server ~]$ curl -X POST -d "foobar" http://localhost:8080/; echo CLIENT VALUES: client_address=10.89.0.2 command=POST real path=/ query=nil request_version=1.1 request_uri=http://localhost:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* content-length=6 content-type=application/x-www-form-urlencoded host=localhost:8080 user-agent=curl/7.61.1 BODY: foobar
-
如先前所述,請使用 Docker Compose 公用程式來檢查日誌,並確認此應用程式傳回成功要求。
sudo /usr/local/bin/docker-compose logs
範例輸出:
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose logs echo-web-1 | 10.89.0.1 - - [17/Jan/2023:14:48:56 +0000] "POST / HTTP/1.1" 200 446 "-" "curl/7.61.1"
-
Docker Compose 公用程式也提供複查 Compose 檔案所啟動之容器的方式。
sudo /usr/local/bin/docker-compose ps
範例輸出:
echo-web-1 k8s.gcr.io/echoserver:1.4 "nginx -g daemon off;" web 12 minutes ago Up 12 minutes 8080/tcp
注意:請執行
docker-compose --help
,查看其他 Docker Compose 公用程式指令。不過,此實驗室的這些額外命令已超出範圍。 -
停止 echoweb 服務。
sudo /usr/local/bin/docker-compose down
範例輸出:
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose down [+] Running 0/0 [+] Running 0/1echo-web-1 Stopping 0.1 [+] Running 0/1echo-web-1 Stopping 0.2 [+] Running 0/1echo-web-1 Stopping 0.3 [+] Running 2/1echo-web-1 Removing 0.4 ��� Container echo-web-1 Removed 0.4s ��� Network echo_default Removed 0.0s
重要資訊
如果 podman-compose
和 docker-compose
執行檔都已安裝在相同的系統上,請務必注意無法以交替方式呼叫。這表示如果程序由 podman-docker
啟動,則無法使用 docker-compose
公用程式來查詢或停止 (反之亦然),如下範例所示:
-
變更至 Compose 檔案所在的目錄。
重要事項:除非您位於
docker-compose.yaml
檔案所在的目錄中,否則podman-compose
或docker-compose
指令無法運作。cd ~/Documents/examples/echo/
-
開始使用 Podman Compose。
podman-compose up -d
-
嘗試使用 Docker Compose 列出執行中的容器。
sudo /usr/local/bin/docker-compose ps
範例輸出
[oracle@ol-server echo]$ sudo /usr/local/bin/docker-compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
-
不過,使用 Podman Compose 會確認容器正在執行中。
podman-compose ps
範例輸出:
[oracle@ol-server echo]$ podman-compose ps ['podman', '--version', ''] using podman version: 4.2.0 podman ps -a --filter label=io.podman.compose.project=echo CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55335e797296 k8s.gcr.io/echoserver:1.4 nginx -g daemon o... 4 minutes ago Up 4 minutes ago 0.0.0.0:8080->8080/tcp echo_web_1 exit code: 0
摘要
這會確認如何使用 Podman 的 Compose 檔案,並使用 podman-compose
或 docker-compose
。
其他相關資訊
檢視其他相關資源:
- Oracle Learning Library
- Oracle Linux 文件:
其他學習資源
探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。
如需產品文件,請造訪 Oracle Help Center 。
Using Compose Files with Podman
F76747-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.