優化 Docker 映象,加速應用部署的 6 個小竅門
基於Kubernetes的新版小米應用引擎在小米生態雲上線3個多月來,深受大家喜愛。為了讓使用者的雲端應用管理更高效、更方便,今天從6個方面分享一些溜到飛起的小竅門。
明確指定映象版本,管理更方便
為了讓版本管理起來更方便,應用部署速度更快,在建立映象的過程中, 建議工程師們 明確 指定包含版本或者其他輔助資訊的tag 。
如果不指定映象tag,預設會使用latest。每次啟動應用例項時,都需要去映象倉庫檢查映象是否更新。這種方式不利於版本管理,對應用啟動速度也有一定影響。
2種方法減小映象體積
1、使用alpine版本的基礎映象,來減小映象體積,以保證部署和擴容速度。
alpine是一個高度精簡又包含了基本工具的輕量級Linux發行版,本身的Docker映象只有4~5M大小。各開發語言和框架都有基於alpine製作的基礎映象,在開發自己應用的映象時,選擇這些映象作為基礎映象,可以大大減小映象的體積。
各種語言對應的基礎映象如下:
-
Java(Spring Boot): - openjdk:8-jdk-alpine,openjdk:8-jre-alpine等
-
Java(Tomcat) - tomcat:8.5-alpine等
-
Nodejs - node:9-alpine, node:8-alpine等
-
Python - python:3-alpine, python:2-alpine等
-
PHP - 基於php:7-fpm-alpine,php:5-fpm-alpine等映象新增nginx,參考https://hub.docker.com/r/trafex/alpine-nginx-php7/
-
Ruby:ruby:2-alpine等
-
Go/可執行檔案 - 直接基於alpine映象,把編譯後的可執行檔案打入映象。因為alpine不同於普通的Ubuntu/Centos等發行版,需要靜態編譯和連結應用程式碼,例如Go需要關閉cgo: CGO_ENABLED=0 go build ...
-
靜態頁面 - nginx:1-alpine等
2、保證Dockerfile中的清理命令在同一行,也可以減小映象體積。
Dockerfile的每條指令都會產生一個檔案層,元件的安裝和清理要放在一條命令裡面 。例如:下面的語句形式可以減小映象體積。
利用分層機制,減小映象傳輸大小
利用分層機制,可以 減小映象傳輸大小,加快映象的推送和拉取速度 。
Docker在build映象的時候,如果某個命令相關的內容沒有變化,會使用上一次快取(cache)的檔案層,在上傳到映象倉庫時,這一層也就不需要上傳了。
利用這一點,在新增應用的時候可以分層新增,具體操作如下:
(1)將 不變或者變化很少的體積較大的依賴庫 和 經常修改的自有程式碼 分開
(2)因為cache快取在執行Dockerbuild命令的本地機器上, 建議固定使用某臺機器來進行Docker build ,以便利用cache(更多相關資訊,可以參考 https://runnable.com/blog/distributing-docker-cache-across-hosts )
舉個例子:
在構建Spring Boot應用映象,我們可以通過以下操作來進行分層。
Step1: 在Dockerfile所在目錄,解壓縮maven生成的jar包
unzip <path-to-app-jar>.jar -d app
Step2: Dockerfile 我們把應用的內容分成4個部分COPY到映象裡面:其中前面3個基本不變,第4個是經常變化的自有程式碼。最後一行是解壓縮後,啟動spring boot應用的方式。
其他型別的應用,比如Java WAR包,Nodejs的npm模組等,可以採取類似的方式。
避免使用程序管理程式,保證應用健康執行
在應用的某個例項崩潰或者非正常退出時,很多程序管理程式並不退出,導致平臺無法檢測到應用已經不可用,進而無法重啟應用。所以要避免使用這類程序管理程式來啟動映象。
2種方法幫助Java應用執行調優
用以下兩種方式可以讓Java應用感知到容器的記憶體限制,避免記憶體溢位。
1、 使用新版本JavaSE 8 ( ≥ 8u131) ,啟動命令加上如下引數,自適應容器記憶體限制(MaxRAMFraction這個引數需要根據實際情況調整,1並不是普適值)
2、 直接指定heap相關的引數。 這種方式缺乏靈活性,在確切知道記憶體限制大小的情況下可以使用。
2點要求保證資料和日誌持久化儲存
1、 避免使用本地儲存。 應用映象啟動後,檔案系統是臨時的,崩潰後即被銷燬。持久化資料,檔案等需要儲存到SDS,FDS等後端儲存服務中
2、 應用日誌不能寫到本地檔案 , 需要寫到標準輸出或者標準錯誤,平臺負責收集、彙總和後續的各種處理。
希望以上幾點建議能夠幫助大家避免或解決實際使用中的問題,讓新版應用引擎為更多使用者的應用管理提供強有力的支撐。