全部產品
Search
文件中心

Container Registry:在Dockerfile中使用構建打包鏡像並運行

更新時間:Jun 30, 2024

通過使用多階段構建應用以及結合阿里雲Container Registry(ACR)的鏡像構建服務,可以使Java應用具有構建安全、構建速度快、鏡像檔案體積小等優點。

前提條件

背景資訊

鏡像構建的通用問題

鏡像構建服務使用Dockerfile來協助使用者構建最終鏡像,但在具體實踐中,存在一些問題:

  • Dockerfile編寫有門檻

    開發人員(尤其是Java)習慣了語言架構的編譯便利性,不知道如何使用Dockerfile構建應用鏡像。

  • 鏡像容易臃腫

    構建鏡像時,開發人員會將專案的編譯、測試、打包構建流程編寫在一個Dockerfile中。每條Dockerfile指令都會為鏡像添加一個新的鏡像層,從而導致鏡像層次深,鏡像檔案體積特別大。

  • 存在源碼泄露風險

    打包鏡像時,原始碼容易被打包到鏡像中,從而產生原始碼泄漏的風險。

多階段構建優勢

針對Java這類的編譯型語言,使用Dockerfile多階段構建,具有以下優勢:

  • 保證構建鏡像的安全性

    當您使用Dockerfile多階段構建鏡像時,需要在第一階段選擇合適的編譯時間基礎鏡像,進行代碼拷貝、專案依賴下載、編譯、測試、打包流程。在第二階段選擇合適的運行時基礎鏡像,拷貝基礎階段產生的運行時依賴檔案。最終構建的鏡像將不包含任何原始碼資訊。

  • 最佳化鏡像的層數和體積

    構建的鏡像僅包含基礎鏡像和編譯製品,鏡像層數少,鏡像檔案體積小。

  • 提升構建速度

    使用構建工具(Docker、Buildkit等),可以並發執行多個構建流程,縮短構建耗時。

步驟一:建立Dockerfile

本文拷貝並託管位於Github上的一個簡單的Dockerfile,帶您來體驗整個流程。請確保您的倉庫中拷貝該Dockerfile成功。

步驟二:繫結來源代碼倉庫

在Container Registry控制台,綁定您託管的代碼倉庫,以下內容以GitHub為例。

  1. 登入Container Registry控制台

  2. 在頂部功能表列,選擇所需地區。

  3. 執行個體列表頁面單擊個人版執行個體。

  4. 在個人版執行個體管理頁面左側導覽列中選擇倉庫管理 > 代碼源

  5. 在GitHub對應的操作列,單擊綁定帳號。在彈出的對話方塊中單擊點擊前往原始碼倉庫登入,跳轉到GitHub。

  6. 在授權介面,單擊Authorize AliyunDeveloper。綁定成功後,會彈出您已成功綁定GitHub帳號的提示資訊。返回至代碼源介面,GitHub欄中顯示已綁定,表示綁定成功。image

步驟三:建立鏡像倉庫

  1. 登入Container Registry控制台

  2. 在頂部功能表列,選擇所需地區。

  3. 執行個體列表頁面單擊個人版執行個體。

  4. 在個人版執行個體管理頁面左側導覽列中選擇倉庫管理 > 鏡像倉庫,然後單擊建立鏡像倉庫

  5. 設定鏡像倉庫資訊。

    配置項

    描述

    樣本

    地區

    鏡像倉庫所在地區。

    華東1(杭州)

    命名空間

    倉庫所屬命名空間。一個鏡像倉庫必須且僅屬於一個命名空間。一個命名空間下可以包含多個鏡像倉庫。

    test23432

    倉庫名稱

    請輸入倉庫名稱。

    test

    倉庫類型

    倉庫類型分為公開私人。無論公開還是私人類型倉庫,推送鏡像都需要先進行登入。公開倉庫所有人均可使用,為了避免您的資料受到損失,建議您使用私人倉庫。

    • 公開:拉取鏡像時可以免登入,直接通過網路拉取。

    • 私人:必須要通過Docker用戶端進行登入,才能拉取鏡像。

    私人

    摘要

    簡要描述資訊。

    -

    描述資訊

    完整描述資訊,支援Markdown格式。

    使用建立Dockerfile中的Dockerfile,結合ACR的鏡像構建服務,進行構建打包以及運行鏡像。

  6. 單擊下一步,設定代碼源。

    參數

    描述

    代碼源

    將代碼源設為GitHub,選擇繫結來源代碼倉庫中綁定的原始碼倉庫。

    構建設定

    本樣本使用代碼變更時自動構建鏡像海外機器構建

    • 代碼變更時自動構建鏡像:當分支有代碼提交後會自動觸發構建規則。

    • 海外機器構建:構建時會在海外機房構建,構建成功後推送到指定地區。

    • 不使用緩衝:每次構建時會強制重新拉取基礎依賴鏡像,可能會增加構建時間。

  7. 單擊建立鏡像倉庫

    建立完成後,會跳轉至鏡像倉庫詳情頁面,您可以在倉庫詳情頁面查看倉庫的基本資料。

  8. 在左側導覽列,單擊倉庫名稱左側的23030201表徵圖。在鏡像倉庫頁面,您可以查看您剛才建立的鏡像倉庫,倉庫狀態顯示正常,即表示倉庫建立成功。

步驟四:執行構建

  1. 在左側導覽列中選擇倉庫管理 > 鏡像倉庫,單擊倉庫名稱或目標倉庫操作列的管理,進入倉庫詳情頁面。

  2. 單擊左側導覽列中的構建,在構建規則設定地區的單擊添加規則

  3. 設定構建規則。

    配置項

    描述

    樣本

    類型

    定義了推送代碼到託管倉庫,觸發構建規則的事件。目前有Branch和Tag兩種類型的推送。

    Branch

    Branch/Tag

    設定構建的代碼分支。

    master

    構建上下文目錄

    設定Dockerfile檔案所在的目錄。這裡的目錄指的是相對目錄,以代碼分支的根目錄為父目錄。本教程中Dockerfile完整路徑是/Dockerfile,此處填寫/

    /

    Dockerfile檔案名稱

    設定Dockerfile檔案名稱,預設為Dockerfile。例如:Dockerfile完整路徑是/Dockerfile,此處填寫Dockerfile。

    Dockerfile

    鏡像版本

    設定鏡像版本。

    V1.0.0

  4. 單擊確認,返回至構建頁面。

  5. 構建規則設定地區中,找到建立的規則,單擊目標規則對應操作列的立即構建

    構建日誌地區中找到構建記錄,當構建狀態顯示成功,表示構建成功。

步驟五:在ECS中安裝Docker

  1. 登入ECS管理主控台

  2. 在左側導覽列,選擇執行個體與鏡像>執行個體

  3. 執行個體列表頁面,找到需要串連的執行個體,單擊該執行個體對應操作列下的遠端連線

  4. 在彈出的串連與命令對話方塊中,單擊通過Workbench遠端連線對應的立即登入

  5. 在彈出的登入執行個體對話方塊中,輸入資訊。一般情況下按精簡選項輸入資訊即可,如下表所示。單擊確定

    配置項

    說明

    執行個體

    自動填滿當前執行個體的資訊。

    網路連接

    本文選擇專用網路。

    • 專用網路執行個體支援選擇公網IP或私網IP串連。

    • 傳統網路執行個體支援選擇公網IP或內網IP串連。

    認證方式

    選擇認證方式,本文選擇密碼認證。支援的認證方式如下:

    • 密碼認證:輸入使用者名稱(例如root或ecs-user),需要繼續輸入登入密碼。

    • 認證認證:輸入使用者名稱(例如root或ecs-user),需要繼續輸入或上傳認證。如果認證已加密,還需要輸入密鑰口令。

    • 憑據認證:選擇已定義好的憑據或者新增憑據。

      憑據用於儲存執行個體的使用者名稱、密碼和密鑰等資訊,您無需每次登入都輸入使用者名稱、密碼,直接選擇憑據即可安全登入執行個體。

  6. 執行如下命令,在ECS中安裝Docker。

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

執行結果

查看構建的鏡像

在個人版執行個體管理頁面左側導覽列中選擇倉庫管理>鏡像倉庫,單擊倉庫名稱或目標倉庫操作列的管理,單擊左側導覽列的鏡像版本,查看構建的鏡像。

在Docker中運行鏡像

  1. 在Docker執行如下命令,登入阿里雲Docker Registry。請將命令中的acr_e2******@test.aliyunid.com替換為您的阿里雲帳號全名,密碼為您在準備環境和資源中設定的密碼;cn-hangzhou替換為您個人版執行個體所在的地區。

    docker login --username=acr_e2******@test.aliyunid.com registry.cn-hangzhou.aliyuncs.com
  2. 執行如下命令,拉取鏡像。請將命令中的cn-hangzhou替換為您個人版執行個體所在的地區;test23432替換為您實際使用的命名空間;test:V1.0.0替換為實際使用的倉庫名稱以及鏡像版本。

    docker pull registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0
  3. 執行如下命令,查看Docker鏡像。

    docker images
  4. 執行如下命令,運行鏡像。請將命令中的cn-hangzhou替換為您個人版執行個體所在的地區;test23432替換為您實際使用的命名空間;test:V1.0.0替換為實際使用的倉庫名稱以及鏡像版本。

    docker run -ti registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0
    Hello World!