1、程序需要前台運行
程序必須前台執行,如果是java進程的話 不要有nohup 或者使用service的方式進行后台運行
否則可能會出現頻繁啟動應用的問題
原因就是docker只能管理運行中的鏡像的一個進程(所以沒有特殊需要不要一個鏡像執行后出現兩個進行的現象,盡量使用k8s的pod來解決)
2、日志要前台打印
日志直接console前台輸出即可,docker會自動收集stdout輸出的日志。不要存在打兩份日志的設置,比如一份file,一份console等。
3、配置文件最好放在鏡像內或遠程可讀取,非必要不要進行卷掛載目錄進行讀取
有些程序的配置文件是外置的,運行包和配置文件沒有在一個執行包中。
如果有以上情況可以將配置文件和運行包都包含在鏡像當中。
如果有些配置文件需要在不同的環境下做出修改或更換,就需要對應用程序進行分別打鏡像或者改造一下程序,使其只是遠程獲取配置文件。分別打鏡像不太符合整個發布流程,因為分別打鏡像包中間可能會有差異,造成生產和開發測試不同。
還有一種方法就是使用k8s的configmap的服務來解決對應讀取文件的問題。
4、數據卷的使用
每個容器運行之后不管你有沒有顯示的指定創建數據卷,都會有一個臨時卷的存在,來存儲一些臨時生成的文件
這些臨時文件會隨着容器的生命周期而變化
如果你直接指定創建了數據卷,一定要創建在共享存儲里面
否則會出現容器漂移之后讀不到數據的情況
這種服務就叫做“有狀態”的服務,一般我們的服務要做到“無狀態”的
如果你的服務是有狀態的,可以借助k8s的statuefulset來實現,包括啟動順序和給服務編號等操作。
5、網絡相關的注意事項(不要有創建網絡相關的操作)
(我們幾乎用不到)
要讓docker內服務識別正確的網卡
6、dockerfile
這里我定義了一個springboot微服務對應的dockerfile文件用來打鏡像包,不管你現在用什么方式最后本質上都是使用 dockerfile來打鏡像的
(如果我們的上線流程不是一個人完成,那么不建議使用maven插件的形式進行打鏡像包,因為運維或者測試人員很可能不懂你的maven文件也不能修改你的pom配置,這樣可能會給后期維護造成麻煩。dockerfile是唯一知道生成鏡像依據的文件,可以使用版本控制進行管理隨着你的應用進行升級等。鏡像是一個黑盒子可以在docker文件系統中使用它,但是他不是一個獨立的文件。)
下面的鏈接是對上面文件的解釋
https://github.com/zygfengyuwuzu/docker-miscellaneous
這個dockerfile中設置了三個參數
JAVA_OPTS是jdk的參數,這個參數可以自己設置內存等jvm相關的優化
AGENT_SERVICE_NAME 是設置skywalking的名稱
AGENT_COLLECTOR_ADDRESS 設置skywalking數據傳輸的地址
SpringBoot項目中的所有可配置項都是可調參數,不用特殊指定。
如果你不需要skywalking進行監控最后一句可以修改成下面這樣,只保留jdk參數
7、打鏡像的一些問題
打包的時候將 dockerfile和jar包最好放在同一路徑下
這樣是比較容易指定要打進鏡像中 文件的路徑
不容易出錯和誤將不需要文件打進鏡像的可能的
(可以將需要打進鏡像的文件都放在一個目錄文件夾中或者和dockerfile相同目錄)
打鏡像包最好使用一個服務器進行打包和上傳,因為多次生成鏡像本地會有緩存文件使用會非常快
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
對於怎么樣實現集成自動化可以參考如下博客(這個博客是jenkins與docker swarm集成的例子,可以將swarm換成k8s,對應的插件換一下)
https://www.cnblogs.com/zhyg/p/7845612.html