使用 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 命令中使用的環境變數。

    使用您的使用者名稱和記號建立 USERTOKEN 環境變數。請確定在使用者名稱中包含 <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>:5808http://<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