使用 Oracle Linux 上的 Podman 建置多平台容器映像檔

簡介

此示範說明使用 Podman 在 Oracle Linux 上建立多平台容器映像檔。

目標

在本教學課程中,您將瞭解如何:

必要條件

部署 Podman 伺服器

  1. 建立 Oracle Linux 運算執行處理。

    如果資源配置使用 x86_64 架構,您便可以使用預設影像和資源配置。選取或建立公用子網路並指定 IPv4 位址。

    此步驟支援使用永遠免費層提供的微型資源配置。

  2. 執行處理執行之後,請登入執行處理。

    ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    其中:

    • <SSH_KEY> 是佈建運算執行處理時所使用 SSH 金鑰的私密部分。範例:~/.ssh/id_rsa
    • <IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE> 是運算執行處理的公用 IP 位址。

安裝並設定遠端存取的 Podman

您可以將這些命令當作運算執行處理上的預設 opc 使用者帳戶,或是任何具有 sudo 存取權的使用者來執行。

  1. 以所有最新的安全性修正與勘誤表更新系統。

    sudo dnf -y update
    
  2. 安裝 Podman 套裝程式或模組。

    Oracle Linux 8:

    sudo dnf module install -y container-tools:ol8
    

    Oracle Linux 9 和 Oracle Linux 10:

    sudo dnf install -y container-tools
    

    容器工具模組或套件會安裝 Podman 及其他容器工具,包括 skopeo 和 buildah。其中一個基本套件是 container-selinux ,它允許在啟用 SELinux 的系統上以非 root 使用者身分執行 podman,該系統預設會啟用 Oracle Linux。

  3. 啟用 Podman 通訊埠。

    systemd 會監聽該通訊埠,並在遠端從屬端啟用 Podman 時啟動執行處理。連線關閉時,systemd 會關閉 Podman 執行處理。

    注意:您可以在無 root 模式下設定遠端 Podman 存取,但超出本教學課程的範圍。

    sudo systemctl enable --now podman.socket
    
  4. 驗證通訊端的路徑。

    sudo systemctl status podman.socket
    

    輸出顯示通訊端監聽,其位置位於 /run/podman/podman.sock。

    這樣做,但稍後在此教學課程中繼續登入 Podman 伺服器執行處理,以執行 SSH 無密碼組態。

部署 Oracle Cloud Developer 執行處理

Oracle Ampere A1 Compute 是結合 Oracle Cloud Infrastructure (OCI) 和 Ampere Altra Arm 處理器的高效能平台。它提供確定的效能、經過實證的安全性,以及廣泛的開發人員生態系統,包括熱門工具和環境 (OS、Kubernetes - OKE、SDK 和 CLI)。

OCI 將 Oracle Cloud Developer Image 列為平台映像檔,其中已安裝所有熱門開發人員工具,包括 Git、Node.js、Java 和 GraalVM。

  1. 建立 Oracle Cloud Developer 運算執行處理。

    選取 Oracle Cloud Developer 映像檔和 Ampere 資源配置。選取與 Podman 伺服器執行處理相同的公用子網路,然後指定 IPv4 位址。

  2. 決定使用傳入規則或 SSH 連接埠轉送。

    您可以透過兩種方式存取將建立的示範 Web 應用程式。雖然您可以同時啟用兩者,但您只需要挑選其中一項。

(選擇性) 建立傳入規則

使用傳入規則是兩個步驟的程序。此選項會從網際網路開啟子網路的存取權,即使在重新啟動後,仍會繼續授予指定連接埠上執行處理的存取權。您必須先在 OCI 內建立規則,然後在 Oracle Linux 執行處理上開啟 firewalld 內的連接埠。

  1. 新增傳入規則至您的公用子網路。

    此規則應允許來自 0.0.0.0/0 之連接埠 5808/tcp 的輸入流量。規則會在建立後立即生效。

  2. 開啟新的終端機,並透過 SSH 連線至 Oracle Cloud Developer 執行處理。

    ssh -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    
  3. 新增示範 Web 應用程式的存取權。

    sudo firewall-cmd --permanent --add-port=5808/tcp
    sudo firewall-cmd --reload
    
  4. 確認防火牆的變更。

    sudo firewall-cmd --list-all
    

    輸出顯示可用的 ports: 5808/tcp。

使用 SSH 連接埠轉寄

  1. 開啟終端機,並透過 SSH 連線至 Oracle Cloud Developer 執行處理。

    -L 選項會啟用本機轉寄,這會開啟本機連接埠,透過 SSH 通道連線至遠端示範 Web 應用程式。

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    

建立 Web 應用程式的容器映像檔並在本機執行

  1. 複製示範應用程式的 Git 儲存區域。

    在本教學課程中,您將部署 RasDash ,這是一個以 Node.js 為基礎的伺服器監控 Web 應用程式。

    git clone https://github.com/sykeben/RasDash.git
    
  2. 變更至原始程式碼目錄。

    cd  ~/RasDash
    
  3. 建立一個 Containerfile ,以建立並為 Web 應用程式提供服務。

    cat << EOF > Containerfile
    FROM ghcr.io/oracle/oraclelinux8-nodejs:14
    COPY . /app
    WORKDIR /app
    RUN npm install && \
      npm test
    CMD ["/usr/bin/node", "app.js", "service"]
    EOF
    
  4. 在本機執行處理上建置並執行映像檔。

    使用 podman 在本機建置容器映像檔,並使用應用程式的版本和平台架構標記映像檔。將每個平台映像檔推送至 Oracle Cloud Infrastructure Registry (OCIR) 和建立兩個平台映像檔清單時,此資訊將有助於日後使用。

    sudo podman build --format docker --tag rasdash:0.3.4-arm64 .
    

    最後一行對您的應用程式建置而言是唯一的。

  5. 使用映像檔執行容器。

    sudo podman run --rm --init -detach --name rasdash --publish 5808:5808 localhost/rasdash:0.3.4-arm64
    

    Podman 傳回的摘要對每個容器執行處理而言都是唯一的。

  6. 檢視執行中的容器。

    sudo podman ps
    

    輸出會將容器顯示為 Up 並執行中。

  7. 檢視容器日誌。

    sudo podman logs rasdash
    

    輸出會顯示 [STATE] Server started。

  8. 檢視 Web 應用程式。

    開啟本機機器上的瀏覽器,並瀏覽至 http://localhost:5808。如果您建立了傳入規則和防火牆規則,則可以使用 Oracle Cloud Developer 執行處理的公用 IP 位址,而不是 localhost。

    注意: CPU 溫度測量結果會顯示 -1,因為 OCI 中的虛擬執行處理無法存取實體硬體資料。

  9. 停止執行中的容器。

    sudo podman stop rasdash
    

設定執行處理之間的無密碼 SSH

Podman 會基於安全考量,在執行處理之間使用 SSH 通訊。為了獲得更順暢的體驗,請在您的雲端開發人員執行處理上建立公開 / 私密金鑰組,然後將其複製到 Podman Remote 伺服器,如此一來,您就可以從開發人員執行處理進行 SSH,而不需要提示輸入密碼。

  1. 在 Oracle Cloud Developer 執行處理上產生公開 / 私密金鑰組。

    ssh-keygen -b 4096 -f ~/.ssh/id_rsa -q -N ""
    
  2. 複製公鑰檔案的內容。

    cat ~/.ssh/id_rsa.pub
    

    從 cat 命令選取輸出並加以複製。

  3. 切換至 Podman 伺服器執行處理。

  4. 在 vi 中開啟檔案。

    vi ~/.ssh/authorized_keys
    

    將公開金鑰內容貼到授權的金鑰檔案中。

    儲存並關閉檔案。

  5. 請確定將正確的檔案系統權限套用至 SSH 目錄和檔案。

    chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
    
  6. 切換至雲端開發人員執行處理。

  7. 測試您是否可以以 opc 使用者身分透過 SSH 連線 Podman 伺服器而不需要密碼。

    注意:如果您有任何問題,請參閱下列文件:

    ssh opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    驗證您不需要密碼即可連線之後,請務必將 Oracle Cloud Developer 執行處理與 Podman 伺服器之間的 SSH 階段作業設為 exit。

  8. 切換至 Podman 伺服器執行處理。

  9. 取代 root 使用者的授權金鑰檔案。

    cat /home/opc/.ssh/authorized_keys | sudo tee /root/.ssh/authorized_keys
    
  10. 切換至雲端開發人員執行處理。

  11. 測試您是否可以與 Podman 伺服器上 root 使用者在雲端開發人員執行處理上的 opc 使用者進行 SSH。

    ssh root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    以 root 使用者身分成功測試與 Podman 伺服器的 SSH 連線之後,您可以 exit 階段作業。

建立 Podman 伺服器的系統連線

  1. 在您的 Podman 伺服器上執行的 Oracle Cloud Developer 執行處理與 Podman 服務之間建立 Podman 系統連線。

    sudo podman system connection add --identity ~/.ssh/id_rsa amd64 ssh://root@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>/run/podman/podman.sock
    

    在上面的命令中,請確定將 <IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE> 取代為您 Podman 伺服器的 IP 位址或主機名稱。

  2. 請確認您已順利新增連線。

    sudo podman system connection list
    

    輸出會顯示 amd64 連線,其 Default 值設為 true。如果系統已設定多個連線,Podman 會使用此連線。

在遠端 Podman 伺服器上建立映像檔

您現在應該可以使用 podman --remote,將命令從 Oracle Cloud Developer 執行處理傳送至遠端 Podman 伺服器執行處理。

  1. 取得 Podman 伺服器的詳細資訊進行測試。

    sudo podman --remote info
    

    架構應報告為 arm64。

  2. 建立遠端映像檔。

    Podman 會自動將整個相關資訊環境複製到遠端執行處理。

    cd ~/RasDash
    sudo podman --remote build --format docker --tag rasdash:0.3.4-amd64 .
    
  3. 確認遠端 Podman 伺服器上的映像檔存在。

    附註: Podman 不會將它建立的影像複製回用戶端機器,因此如果您執行 sudo podman images,將不會列出該影像。不過,它可以在遠端機器上使用。

    sudo podman --remote images
    

    輸出範例:

    REPOSITORY                          TAG          IMAGE ID      CREATED        SIZE
    localhost/rasdash                   0.3.4-amd64  3a1b9755ebdd  8 seconds ago  439 MB
    ...
    
  4. 驗證本機映像檔架構。

    驗證已為特定平台建立 (且在上) 每個影像的最終方法,架構使用 jq 擷取每個影像資訊清單中的 Architecture 欄位值。

    sudo podman inspect rasdash:0.3.4-arm64 | jq -r '.[] | .Architecture'
    

    本機影像會將其架構報告為 arm64。

  5. 檢查遠端影像 。

    sudo podman --remote inspect rasdash:0.3.4-amd64 | jq -r '.[] | .Architecture'
    

    遠端影像會報告為 amd64。

建立容器登錄儲存區域

在 Oracle Cloud Infrastructure 主控台中,瀏覽至容器登錄區段並建立儲存區域,以儲存您的多平台應用程式。

如需詳細資訊,請參閱 Oracle Cloud Infrastructure 文件中的建立儲存區域。

  1. 建立專用 demo/rasdash 儲存區域。

    建立儲存區域

  2. 複查新儲存區域的詳細資訊。

    儲存庫明細

收集容器登錄儲存區域證明資料

下表提供此教學課程中後續步驟所使用的範例值。iad 範例是美國東部 (阿什本) 區域的區域索引鍵。如果您的區域是德國中部 (法蘭克福),則區域索引鍵為 fra。如需列出可用區域金鑰的完整表格,請參閱區域和可用性網域文件。

登錄資料 教學課程預留位置 備註
REGISTRY_NAMESPACE gse00015915 在儲存區域資訊面板中顯示為「命名空間」
REPOSITORY_NAME demo/rasdash 以區間名稱顯示
OCIR_INSTANCE iad.ocir.io 使用 <region>.ocir.io

如有需要,請參閱使用 Docker CLI 植入影像。此程序說明使用 CLI 將影像推送至容器登錄所需的登入程序。

  1. 取得您的使用者名稱。

    您必須要有使用者名稱和認證權杖,才能登入容器登錄。若要取得使用者名稱,請在 Oracle Cloud Infrastructure 主控台的右上角,開啟設定檔功能表 (使用者功能表圖示),然後按一下我的設定檔以檢視詳細資訊。

    複製並儲存使用者名稱,包括主控台中顯示的 tenancy-namespace。

    使用者

  2. 產生認證權杖。

    向下捲動主控台中的我的設定檔頁面,然後在資源底下選取 Auth Tokens 。

    選取產生記號按鈕,然後為新記號提供 demo 的描述。

    基因符記

    產生權杖之後,請務必複製並儲存該權杖。

    複製單詞

登入容器登錄儲存區域

下表提供此教學課程中後續步驟所使用的範例值。

使用者名稱 教學課程預留位置
REGISTRY_NAMESPACE gse00015915
使用者名稱 luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e
東京語 ]y#W_iS9GKC}4l1Gq9Fn
OCIR_INSTANCE iad.ocir.io
  1. 建立要在 podman login 命令中使用的環境變數。

    使用您的使用者名稱和記號建立 USER 和 TOKEN 環境變數。請確定在使用者名稱中包含 <REGISTRY_NAMESPACE>。

    export OCIR_INSTANCE="iad.ocir.io"
    export OCIR_NAMESPACE="gse00015915"
    export OCI_USERNAME="luna.user@e1ab5742-7e30-463a-9017-0b48fa54197e"
    export OCIR_USERNAME="$OCIR_NAMESPACE/$OCI_USERNAME"
    export OCI_USER_TOKEN="]y#W_iS9GKC}4l1Gq9Fn"
    
  2. 登入容器登錄。

    sudo -E podman login -u $OCIR_USERNAME -p $OCIR_USER_TOKEN $OCIR_INSTANCE
    

    遠端執行處理會自動繼承從屬端執行處理的認證證明資料。

推送平台影像

在此範例中,具有平台特定標記的最終儲存庫 URI 為:

Podman 可以將本機影像推送至遠端登錄,而不需要事先標記影像。

  1. 推送本機 rasdash/0.3.4-arm64 影像。

    sudo -E podman push rasdash:0.3.4-arm64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64
    
  2. 推送遠端 rasdash:0.3.4-amd64 影像。

    sudo -E podman --remote push rasdash:0.3.4-amd64 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64
    
  3. 檢查容器登錄主控台。

    注意:推送遠端影像不會產生本機輸出。請複查 rasdash:0.3.4-amd64 標記的容器登錄主控台,以檢查您是否已順利推送影像。

    您應該會在容器登錄主控台中看到兩個影像。

    images - 影像

    0.3.4-amd64 影像:

    images - 影像

    0.3.4-arm64 影像:

    images - 影像

建立與發送資訊清單至容器登錄

現在您有兩個平台映像檔,可以建立清單清單,讓容器程式實際執行為其平台選取適當的映像檔 (即作業系統與架構的組合)。

由於大多數容器映像檔都是以 Linux 為基礎,因此使用者通常會將多平台映像檔視為多重存檔映像檔。不過,也可以將可在 Windows、macOS 和 Linux 上執行的映像檔結合成單一清單。

  1. 建立並植入資訊清單。

    只使用標記中的應用程式版本,在雲端開發人員執行處理上建立本機資訊清單。

    sudo podman manifest create rasdash:0.3.4
    

    與之前一樣,總和檢查輸出對您所建立的清單而言是唯一的,而且與上述清單不符。

  2. 檢查資訊清單,以顯示目前使用的 mediaType 及其成員影像。

    sudo podman manifest inspect rasdash:0.3.4
    
  3. 將兩個平台特定的映像檔新增至清單中。

    sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-arm64
    
    sudo -E podman manifest add rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4-amd64
    
  4. 檢查安裝資訊清單。

    sudo podman manifest inspect rasdash:0.3.4
    

    新增影像之後,輸出就更有趣。

    為達到最高相容性,您需將 --format docker 參數新增至每個建置命令,此命令指示 Podman 使用 Docker 影像資訊清單 V2、綱要 2 (v2s2) 規格建立影像,而非預設 Podman 將使用的開啟容器初步計畫影像資訊清單規格。

    因為清單使用 v2s2 規格,所以 Podman 使用關聯的 v2s2 清單規格,而非 Open Container Initiative Image Index Specification 。

    雲端管理 Kubernetes 服務 (包括 Oracle Engine for Kubernetes (OKE) 和內部部署自行代管 Kubernetes 發行套件) 使用的預設容器執行時期,與這兩個規格相容。

  5. 將資訊清單清單推送至容器登錄。

    現在您已建立清單清單,可以將清單推送至儲存平台特定影像的相同容器登錄儲存庫。

    sudo -E podman manifest push --all rasdash:0.3.4 docker://$OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    

    此動作是快速操作,因為您先前已將平台特定的影像推送。容器登錄只會連結資訊清單清單至現有影像。

  6. 在本機建立並執行影像。

    您現在可以使用資訊清單標記 (而非平台特定標記) 在本機和遠端執行映像檔執行處理。

    sudo -E podman run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    
  7. 從遠端建立並執行影像。

    sudo -E podman --remote run --rm --detach --init --publish 5808:5808 $OCIR_INSTANCE/$OCIR_NAMESPACE/demo/rasdash:0.3.4
    

使用瀏覽器測試影像

假設您已在執行處理上建立必要的傳入規則和防火牆規則。在此情況下,您應該能夠開啟瀏覽器並瀏覽至 http://<PUBLIC_IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>:5808 和 http://<PUBLIC_IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>:5808,以開啟在每個執行處理上執行的 RasDash Web 應用程式。

否則,便可以像之前一樣,使用 SSH 連接埠轉送,從本機機器建立兩個通道。

  1. 開啟 Oracle Cloud Developer 執行處理的 SSH 通道。

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_ORACLE_CLOUD_DEVELOPER_INSTANCE>
    

    開啟本機機器上的瀏覽器,然後瀏覽至 http://localhost:5808,即可在 Cloud Development 執行處理上檢視 arm64 型 Web 應用程式。

  2. 結束 SSH 通道階段作業。

  3. 開啟 Podman 伺服器執行處理的 SSH 通道。

    ssh -L 5808:localhost:5808 -i <SSH_KEY> opc@<IP_ADDRESS_OF_PODMAN_SERVER_INSTANCE>
    

    重新整理本機機器上指向 http://localhost:5808 的瀏覽器,以檢視 Podman Server 執行處理上以 amd64 為基礎的 Web 應用程式。

接下來的步驟

完成本教學課程之後,您應該知道如何建立可以從專用和公用 OCIR 儲存區域部署的映像檔。您可以在各種位置使用這些映像檔,例如 Oracle Engine for Kubernetes (OKE) 或 Oracle Cloud Native Environment。將映像檔部署到 Oracle Cloud Infrastructure 外部的主機 (包括 Mac 或 Windows 版 Podman Desktop) 時,您應該確定儲存區域是公開的。

其他學習資源

在 docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

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