注意:

使用 Podman 編寫檔案

簡介

Docker Compose 是一種命令行工具,使用特殊格式的 YAML 檔案作為輸入來組合,然後執行單一或多個容器作為應用程式。這可讓開發者針對其應用程式開發、測試及傳遞單一 YAML 檔案給使用者,並且只使用一個命令來加以啟動及停止。這個可攜性與可靠性使得 Docker Compose 不僅在使用者和開發人員都廣為受歡迎,而且越來越需要。

目標

這個實驗室說明如何安裝和使用 podman-composedocker-compose 搭配 Podman,並驗證是否使用簡單的 docker-compose.yaml 檔案。

必要條件

Oracle Support 免責聲明

Oracle 不會針對下列指示所提供的步驟順序提供技術支援,因為這些步驟是指並非由 Oracle 提供的軟體程式和作業系統。本教學課程提供選擇性指示,僅供參考。

如需 Oracle 支援開發及使用 Podman 型服務的方法的詳細資訊,請參閱 https://docs.oracle.com/en/operating-systems/oracle-linux/podman/。

設定實驗室環境

注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以瞭解連線和其他用途指示。

  1. 開啟終端機,如果尚未連線,則透過 ssh 連線到 ol-server 執行處理。

    ssh oracle@<ip_address_of_instance>
    

確認 Podman 工作

Oracle Linux 中的容器工具套件提供最新的 Podman、Buildah、Skopeo 及相關相依性版本。

  1. 檢查 Podman 的版本。

    podman -v
    
  2. 確認 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-composedocker-compose

安裝 Podman Docker 套裝程式

這可讓 Podman 以原生方式使用 Docker 命令。

  1. 安裝 podman-docker 套裝軟體。

    sudo dnf install -y podman-docker
    

安裝 Docker Compose

注意:

如此處所述,以獨立方式安裝需要使用 docker-compose,而非使用 docker composeDocker 公用程式時使用的標準語法。換句話說,請以 docker-compose up 取代 docker compose up 語法。

  1. 下載並安裝獨立的 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
    
    
  2. 在二進位檔套用執行檔權限 。

    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 確認撰寫獨立工作。

    docker-compose version
    

    範例輸出:

    [oracle@ol-server ~]$ docker-compose version
    Docker Compose version v2.15.1
    
    

啟動 Podman 通訊埠

若要讓 Docker Compose 功能透過建立 Unix 通訊埠運作,必須執行下列步驟。

  1. 使用下列步驟設定 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.
    
  2. 使用 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 執行的組合規格

  1. 安裝 Podman Compose 之前,請先確認已將管線更新為最新版本。

    sudo -H pip3 install --upgrade pip
    
  2. 安裝 Podman Compose 套裝程式。

    sudo pip3 install podman-compose 
    

    pip3 install 執行為 sudo 時,可以忽略 WARNING 訊息。

  3. 確認 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 檔案可讓您提取和啟動指定的應用程式。

  1. 建立測試目錄。

    mkdir -p Documents/examples/echo
    
  2. 變更成目錄。

    cd Documents/examples/echo
    
  3. 建立 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
    
  4. 檢閱剛剛建立的 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 正在運作中

  1. 變更至 docker-compose 檔案所在的目錄。

    重要:除非您位於 docker-compose.yaml 檔案所在的目錄中,否則 podman-compose 指令無法運作。

    cd ~/Documents/examples/echo/
    
  2. 啟動 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 檔案中參照的任何容器才會被提取。

  3. 測試 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
    
  4. 審核日誌以確認成功。

    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
    
    
  5. 使用 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 公用程式指令。不過,此實驗室的這些額外命令已超出範圍。

  6. 現在是時候停止 echoweb 服務了。

    podman-compose down
    

確認 Docker Compose 正在運作中

  1. (可選擇) 變更至 docker-compose 檔案所在的目錄。

    重要:除非您位於 docker-compose.yaml 檔案所在的目錄中,否則 docker-compose 指令無法運作。

    cd ~/Documents/examples/echo/
    
  2. 啟動 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 容器仍在執行中。依照先前的步驟停止。

  3. 測試容器正在執行中。

    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
    
  4. 如先前所述,請使用 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"
    
    
  5. 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 公用程式指令。不過,此實驗室的這些額外命令已超出範圍。

  6. 停止 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 公用程式來查詢或停止 (反之亦然),如下範例所示:

  1. 變更至 Compose 檔案所在的目錄。

    重要事項:除非您位於 docker-compose.yaml 檔案所在的目錄中,否則 podman-composedocker-compose 指令無法運作。

    cd ~/Documents/examples/echo/
    
  2. 開始使用 Podman Compose。

    podman-compose up -d
    
  3. 嘗試使用 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
    
  4. 不過,使用 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-composedocker-compose

其他相關資訊

檢視其他相關資源:

其他學習資源

探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。

如需產品文件,請造訪 Oracle Help Center