通過使用多階段構建應用以及結合阿里雲Container Registry(ACR)的鏡像構建服務,可以使Java應用具有構建安全、構建速度快、鏡像檔案體積小等優點。
前提條件
請準備一個託管在Github、Gitlab或者Bitbucket平台上的Java原始碼倉庫。
說明您可以拷貝並託管位於Github上的一個簡單的Java Maven專案來體驗整個流程。
背景資訊
鏡像構建的通用問題
鏡像構建服務使用Dockerfile來協助使用者構建最終鏡像,但在具體實踐中,存在一些問題:
Dockerfile編寫有門檻
開發人員(尤其是Java)習慣了語言架構的編譯便利性,不知道如何使用Dockerfile構建應用鏡像。
鏡像容易臃腫
構建鏡像時,開發人員會將專案的編譯、測試、打包構建流程編寫在一個Dockerfile中。每條Dockerfile指令都會為鏡像添加一個新的鏡像層,從而導致鏡像層次深,鏡像檔案體積特別大。
存在源碼泄露風險
打包鏡像時,原始碼容易被打包到鏡像中,從而產生原始碼泄漏的風險。
多階段構建優勢
針對Java這類的編譯型語言,使用Dockerfile多階段構建,具有以下優勢:
保證構建鏡像的安全性
當您使用Dockerfile多階段構建鏡像時,需要在第一階段選擇合適的編譯時間基礎鏡像,進行代碼拷貝、專案依賴下載、編譯、測試、打包流程。在第二階段選擇合適的運行時基礎鏡像,拷貝基礎階段產生的運行時依賴檔案。最終構建的鏡像將不包含任何原始碼資訊。
最佳化鏡像的層數和體積
構建的鏡像僅包含基礎鏡像和編譯製品,鏡像層數少,鏡像檔案體積小。
提升構建速度
使用構建工具(Docker、Buildkit等),可以並發執行多個構建流程,縮短構建耗時。
步驟一:建立Dockerfile
本文拷貝並託管位於Github上的一個簡單的Dockerfile,帶您來體驗整個流程。請確保您的倉庫中拷貝該Dockerfile成功。
步驟二:繫結來源代碼倉庫
在Container Registry控制台,綁定您託管的代碼倉庫,以下內容以GitHub為例。
在頂部功能表列,選擇所需地區。
在執行個體列表頁面單擊個人版執行個體。
在個人版執行個體管理頁面左側導覽列中選擇 。
在GitHub對應的操作列,單擊綁定帳號。在彈出的對話方塊中單擊點擊前往原始碼倉庫登入,跳轉到GitHub。
在授權介面,單擊Authorize AliyunDeveloper。綁定成功後,會彈出您已成功綁定GitHub帳號的提示資訊。返回至代碼源介面,GitHub欄中顯示已綁定,表示綁定成功。
步驟三:建立鏡像倉庫
在頂部功能表列,選擇所需地區。
在執行個體列表頁面單擊個人版執行個體。
在個人版執行個體管理頁面左側導覽列中選擇 ,然後單擊建立鏡像倉庫。
設定鏡像倉庫資訊。
配置項
描述
樣本
地區
鏡像倉庫所在地區。
華東1(杭州)
命名空間
倉庫所屬命名空間。一個鏡像倉庫必須且僅屬於一個命名空間。一個命名空間下可以包含多個鏡像倉庫。
test23432
倉庫名稱
請輸入倉庫名稱。
test
倉庫類型
倉庫類型分為公開和私人。無論公開還是私人類型倉庫,推送鏡像都需要先進行登入。公開倉庫所有人均可使用,為了避免您的資料受到損失,建議您使用私人倉庫。
公開:拉取鏡像時可以免登入,直接通過網路拉取。
私人:必須要通過Docker用戶端進行登入,才能拉取鏡像。
私人
摘要
簡要描述資訊。
-
描述資訊
完整描述資訊,支援Markdown格式。
使用建立Dockerfile中的Dockerfile,結合ACR的鏡像構建服務,進行構建打包以及運行鏡像。
單擊下一步,設定代碼源。
參數
描述
代碼源
將代碼源設為GitHub,選擇繫結來源代碼倉庫中綁定的原始碼倉庫。
構建設定
本樣本使用代碼變更時自動構建鏡像和海外機器構建。
代碼變更時自動構建鏡像:當分支有代碼提交後會自動觸發構建規則。
海外機器構建:構建時會在海外機房構建,構建成功後推送到指定地區。
不使用緩衝:每次構建時會強制重新拉取基礎依賴鏡像,可能會增加構建時間。
單擊建立鏡像倉庫。
建立完成後,會跳轉至鏡像倉庫詳情頁面,您可以在倉庫詳情頁面查看倉庫的基本資料。
在左側導覽列,單擊倉庫名稱左側的表徵圖。在鏡像倉庫頁面,您可以查看您剛才建立的鏡像倉庫,倉庫狀態顯示正常,即表示倉庫建立成功。
步驟四:執行構建
在左側導覽列中選擇 ,單擊倉庫名稱或目標倉庫操作列的管理,進入倉庫詳情頁面。
單擊左側導覽列中的構建,在構建規則設定地區的單擊添加規則。
設定構建規則。
配置項
描述
樣本
類型
定義了推送代碼到託管倉庫,觸發構建規則的事件。目前有Branch和Tag兩種類型的推送。
Branch
Branch/Tag
設定構建的代碼分支。
master
構建上下文目錄
設定Dockerfile檔案所在的目錄。這裡的目錄指的是相對目錄,以代碼分支的根目錄為父目錄。本教程中Dockerfile完整路徑是/Dockerfile,此處填寫/。
/
Dockerfile檔案名稱
設定Dockerfile檔案名稱,預設為Dockerfile。例如:Dockerfile完整路徑是/Dockerfile,此處填寫Dockerfile。
Dockerfile
鏡像版本
設定鏡像版本。
V1.0.0
單擊確認,返回至構建頁面。
在構建規則設定地區中,找到建立的規則,單擊目標規則對應操作列的立即構建。
在構建日誌地區中找到構建記錄,當構建狀態顯示成功,表示構建成功。
步驟五:在ECS中安裝Docker
登入ECS管理主控台。
在左側導覽列,選擇執行個體與鏡像>執行個體。
在執行個體列表頁面,找到需要串連的執行個體,單擊該執行個體對應操作列下的遠端連線。
在彈出的串連與命令對話方塊中,單擊通過Workbench遠端連線對應的立即登入。
在彈出的登入執行個體對話方塊中,輸入資訊。一般情況下按精簡選項輸入資訊即可,如下表所示。單擊確定。
配置項
說明
執行個體
自動填滿當前執行個體的資訊。
網路連接
本文選擇專用網路。
專用網路執行個體支援選擇公網IP或私網IP串連。
傳統網路執行個體支援選擇公網IP或內網IP串連。
認證方式
選擇認證方式,本文選擇密碼認證。支援的認證方式如下:
密碼認證:輸入使用者名稱(例如root或ecs-user),需要繼續輸入登入密碼。
認證認證:輸入使用者名稱(例如root或ecs-user),需要繼續輸入或上傳認證。如果認證已加密,還需要輸入密鑰口令。
憑據認證:選擇已定義好的憑據或者新增憑據。
憑據用於儲存執行個體的使用者名稱、密碼和密鑰等資訊,您無需每次登入都輸入使用者名稱、密碼,直接選擇憑據即可安全登入執行個體。
執行如下命令,在ECS中安裝Docker。
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
執行結果
查看構建的鏡像
在個人版執行個體管理頁面左側導覽列中選擇倉庫管理>鏡像倉庫,單擊倉庫名稱或目標倉庫操作列的管理,單擊左側導覽列的鏡像版本,查看構建的鏡像。
在Docker中運行鏡像
在Docker執行如下命令,登入阿里雲Docker Registry。請將命令中的
acr_e2******@test.aliyunid.com
替換為您的阿里雲帳號全名,密碼為您在準備環境和資源中設定的密碼;cn-hangzhou
替換為您個人版執行個體所在的地區。docker login --username=acr_e2******@test.aliyunid.com registry.cn-hangzhou.aliyuncs.com
執行如下命令,拉取鏡像。請將命令中的
cn-hangzhou
替換為您個人版執行個體所在的地區;test23432
替換為您實際使用的命名空間;test:V1.0.0
替換為實際使用的倉庫名稱以及鏡像版本。docker pull registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0
執行如下命令,查看Docker鏡像。
docker images
執行如下命令,運行鏡像。請將命令中的
cn-hangzhou
替換為您個人版執行個體所在的地區;test23432
替換為您實際使用的命名空間;test:V1.0.0
替換為實際使用的倉庫名稱以及鏡像版本。docker run -ti registry.cn-hangzhou.aliyuncs.com/test23432/test:V1.0.0 Hello World!