通過使用多階段構建應用以及結合阿里雲Container Registry(ACR)的鏡像構建服務,可以使Java應用具有構建安全、構建速度快、鏡像檔案體積小等優點。
前提條件
在使用Container Registry之前,需要先安裝Docker。關於如何安裝Docker,請參見安裝Docker。
請準備一個託管在GitHub、GitLab或者Bitbucket平台上的Java原始碼倉庫。
說明您可以拷貝並託管位於GitHub上的一個簡單的Java Maven專案來體驗整個流程。
背景資訊
鏡像構建的通用問題
鏡像構建服務使用Dockerfile來協助使用者構建最終鏡像,但在具體實踐中,存在一些問題:
Dockerfile編寫有門檻
開發人員(尤其是Java)習慣了語言架構的編譯便利性,不知道如何使用Dockerfile構建應用鏡像。
鏡像容易臃腫
構建鏡像時,開發人員會將專案的編譯、測試、打包構建流程編寫在一個Dockerfile中。每條Dockerfile指令都會為鏡像添加一個新的鏡像層,從而導致鏡像層次深,鏡像檔案體積特別大。
存在源碼泄露風險
打包鏡像時,原始碼容易被打包到鏡像中,從而產生原始碼泄露的風險。
多階段構建優勢
針對Java這類的編譯型語言,使用Dockerfile多階段構建,具有以下優勢:
保證構建鏡像的安全性
當您使用Dockerfile多階段構建鏡像時,需要在第一階段選擇合適的編譯時間基礎鏡像,進行代碼拷貝、專案依賴下載、編譯、測試、打包流程。在第二階段選擇合適的運行時基礎鏡像,拷貝基礎階段產生的運行時依賴檔案。最終構建的鏡像將不包含任何原始碼資訊。
最佳化鏡像的層數和體積
構建的鏡像僅包含基礎鏡像和編譯製品,鏡像層數少,鏡像檔案體積小。
提升構建速度
使用構建工具(Docker、Buildkit等),可以並發執行多個構建流程,縮短構建耗時。
步驟一:繫結來源代碼倉庫
在Container Registry控制台,綁定您託管的代碼倉庫,以下內容以GitHub為例。
在頂部功能表列,選擇所需地區。
在執行個體列表頁面單擊個人版執行個體。
在個人版執行個體管理頁面左側導覽列中選擇。
在GitHub對應的操作列,單擊綁定帳號。在彈出的對話方塊中單擊點擊前往原始碼倉庫登入,跳轉到GitHub。
在授權介面,單擊Authorize AliyunDeveloper。綁定成功後,會彈出您已成功綁定GitHub帳號的提示資訊。返回至代碼源介面,GitHub欄中顯示已綁定,表示綁定成功。

步驟二:建立鏡像倉庫
在頂部功能表列,選擇所需地區。
在執行個體列表頁面單擊個人版執行個體。
在個人版執行個體管理頁面左側導覽列中選擇,然後單擊建立鏡像倉庫。
設定鏡像倉庫資訊。
配置項
描述
樣本
地區
鏡像倉庫所在地區。
華東1(杭州)
命名空間
倉庫所屬命名空間。一個鏡像倉庫必須且僅屬於一個命名空間。一個命名空間下可以包含多個鏡像倉庫。
test23432
倉庫名稱
請輸入倉庫名稱。
test
倉庫類型
倉庫類型分為公開和私人。無論是公開還是私人類型倉庫,推送鏡像都需要先進行登入。公開倉庫所有人均可使用,為了避免您的資料受到損失,建議您使用私人倉庫。
公開:拉取鏡像時可以免登入,直接通過網路拉取。
私人:必須要通過Docker用戶端進行登入,才能拉取鏡像。
私人
摘要
簡要描述資訊。
-
描述資訊
完整描述資訊,支援Markdown格式。
使用建立的Dockerfile,結合ACR的鏡像構建服務,進行構建打包以及運行鏡像。
單擊下一步,設定代碼源。
參數
描述
代碼源
將代碼源設為GitHub,選擇繫結來源代碼倉庫中綁定的原始碼倉庫。
構建設定
本樣本使用代碼變更時自動構建鏡像和海外機器構建。
代碼變更時自動構建鏡像:當分支有代碼提交後會自動觸發構建規則。
海外機器構建:構建時會在海外機房構建,構建成功後推送到指定地區。
不使用緩衝:每次構建時會強制重新拉取基礎依賴鏡像,可能會增加構建時間。
單擊建立鏡像倉庫。
建立完成後,會跳轉至鏡像倉庫詳情頁面,您可以在倉庫詳情頁面查看倉庫的基本資料。
在左側導覽列,單擊倉庫名稱左側的
表徵圖。在鏡像倉庫頁面,您可以查看您剛才建立的鏡像倉庫,倉庫狀態顯示正常,即表示倉庫建立成功。
步驟三:執行構建
在左側導覽列中選擇,單擊倉庫名稱或目標倉庫操作列的管理,進入倉庫詳情頁面。
單擊左側導覽列中的構建,在構建規則設定地區的單擊添加規則。
設定構建規則。
配置項
描述
樣本
類型
定義了推送代碼到託管倉庫,觸發構建規則的事件。目前有Branch和Tag兩種類型的推送。
Branch
Branch/Tag
設定構建的代碼分支。
master
構建上下文目錄
設定Dockerfile檔案所在的目錄。這裡的目錄指的是相對目錄,以代碼分支的根目錄為父目錄。本教程中Dockerfile完整路徑是/Dockerfile,此處填寫/。
/
Dockerfile檔案名稱
設定Dockerfile檔案名稱,預設為Dockerfile。例如:Dockerfile完整路徑是/Dockerfile,此處填寫Dockerfile。
Dockerfile
鏡像版本
設定鏡像版本。
V1.0.0
單擊確認,返回至構建頁面。
在構建規則設定地區中,找到建立的規則,單擊目標規則對應操作列的立即構建。
在構建日誌地區中找到構建記錄,當構建狀態顯示成功,表示構建成功。
執行結果
查看構建的鏡像
在個人版執行個體管理頁面左側導覽列中選擇倉庫管理>鏡像倉庫,單擊倉庫名稱或目標倉庫操作列的管理,單擊左側導覽列的鏡像版本,查看構建的鏡像。
在Docker中運行鏡像
2024年09月09日起,新個人版執行個體的訪問網域名稱作出調整,詳情請參見新個人版執行個體使用限制。您根據情況選擇不同的推送和拉取鏡像方式。
新版個人版執行個體
在Docker執行如下命令,登入阿里雲Docker Registry。請將命令中的
acr_e2******@test.aliyunid.com替換為您的阿里雲帳號全名,密碼為您在準備環境和資源中設定的密碼;cn-hangzhou替換為您個人版執行個體所在的地區。crpi-xxxx替換為您個人版執行個體ID,您登入Container Registry控制台單擊個人版執行個體,然後在概覽頁面的執行個體資訊頁簽中擷取執行個體ID。docker login --username=acr_e2******@test.aliyunid.com crpi-xxxx.cn-hangzhou.personal.cr.aliyuncs.com執行如下命令,拉取鏡像。
docker pull crpi-xxxx.cn-hangzhou.personal.cr.aliyuncs.com/test23432/test:V1.0.0執行如下命令,查看Docker鏡像。
docker images執行如下命令,運行鏡像。
docker run -ti crpi-xxxx.cn-hangzhou.personal.cr.aliyuncs.com/test23432/test:V1.0.0 Hello World!
舊版個人版執行個體
在Docker執行如下命令,登入阿里雲Docker Registry。請將命令中的
acr_e2******@test.aliyunid.com替換為您的阿里雲帳號全名,密碼為您在準備環境和資源中設定的密碼;cn-hangzhou替換為您個人版執行個體所在的地區。docker login --username=acr_e2******@test.aliyunid.com registry.cn-hangzhou.cr.aliyuncs.com執行如下命令,拉取鏡像。請將命令中的
cn-hangzhou替換為您個人版執行個體所在的地區;test23432替換為您實際使用的命名空間;test:V1.0.0替換為實際使用的倉庫名稱以及鏡像版本。docker pull registry.cn-hangzhou.cr.aliyuncs.com/test23432/test:V1.0.0執行如下命令,查看Docker鏡像。
docker images執行如下命令,運行鏡像。請將命令中的
cn-hangzhou替換為您個人版執行個體所在的地區;test23432替換為您實際使用的命名空間;test:V1.0.0替換為實際使用的倉庫名稱以及鏡像版本。docker run -ti registry.cn-hangzhou.cr.aliyuncs.com/test23432/test:V1.0.0 Hello World!