通過使用多階段構建應用以及結合阿里云容器鏡像服務(ACR)的鏡像構建服務,可以使Java應用具有構建安全、構建速度快、鏡像文件體積小等優點。
前提條件
開通阿里云容器鏡像服務。
請準備一個托管在Github、Gitlab或者Bitbucket平臺上的Java源代碼倉庫。
說明您可以拷貝并托管位于Github上的一個簡單的Java Maven項目來體驗整個流程。
背景信息
鏡像構建的通用問題
鏡像構建服務使用Dockerfile來幫助用戶構建最終鏡像,但在具體實踐中,存在一些問題:
Dockerfile編寫有門檻
開發者(尤其是Java)習慣了語言框架的編譯便利性,不知道如何使用Dockerfile構建應用鏡像。
鏡像容易臃腫
構建鏡像時,開發者會將項目的編譯、測試、打包構建流程編寫在一個Dockerfile中。每條Dockerfile指令都會為鏡像添加一個新的鏡像層,從而導致鏡像層次深,鏡像文件體積特別大。
存在源碼泄露風險
打包鏡像時,源代碼容易被打包到鏡像中,從而產生源代碼泄漏的風險。
多階段構建優勢
針對Java這類的編譯型語言,使用Dockerfile多階段構建,具有以下優勢:
保證構建鏡像的安全性
當您使用Dockerfile多階段構建鏡像時,需要在第一階段選擇合適的編譯時基礎鏡像,進行代碼拷貝、項目依賴下載、編譯、測試、打包流程。在第二階段選擇合適的運行時基礎鏡像,拷貝基礎階段生成的運行時依賴文件。最終構建的鏡像將不包含任何源代碼信息。
優化鏡像的層數和體積
構建的鏡像僅包含基礎鏡像和編譯制品,鏡像層數少,鏡像文件體積小。
提升構建速度
使用構建工具(Docker、Buildkit等),可以并發執行多個構建流程,縮短構建耗時。
步驟一:創建Dockerfile
本文拷貝并托管位于Github上的一個簡單的Dockerfile,帶您來體驗整個流程。請確保您的倉庫中拷貝該Dockerfile成功。
步驟二:綁定源代碼倉庫
在容器鏡像服務控制臺,綁定您托管的代碼倉庫,以下內容以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 Hub鏡像變慢。建議您手動拉取鏡像到本地節點,然后重啟Pod。執行如下命令,在Docker中配置鏡像加速器。
登錄容器鏡像服務控制臺。在頂部菜單欄,選擇創建的容器實例所在地域。
在左側導航欄,選擇鏡像工具>鏡像加速器。在加速器區域,復制加速器地址。
執行如下命令,在Docker中配置鏡像加速器。請將
https://gwsg6nw9.mirror.aliyuncs.com
替換為您在上一步驟中復制的加速器地址。mkdir -p /etc/docker #創建配置文件目錄。 tee /etc/docker/daemon.json <<-'EOF' #寫入加速配置。 { "registry-mirrors": ["https://gwsg6nw9.mirror.aliyuncs.com"] } EOF systemctl daemon-reload #重新加載配置文件。 systemctl restart docker #重啟Docker服務。
執行結果
查看構建的鏡像
在個人版實例管理頁面左側導航欄中選擇倉庫管理>鏡像倉庫,單擊倉庫名稱或目標倉庫操作列的管理,單擊左側導航欄的鏡像版本,查看構建的鏡像。
在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!