一、常用部署工具
jenkins,docker生態是比較常用的工具,本文也主要是聊這幾個。其他如Kubernetes (K8s),Ansible,GitLab CI/CD等工具本文只是暫時提一下,不展開討論。
二、比較jenkins和docker生態
1、jenkins
優點
jenkins功能豐富,而且配置比較靈活。比如支持git,maven,gitee或github庫,SSH。對于普通的javaweb項目的部署還是很方便的。
缺點
但是對于初學者來說,要學習的不少,配置的東西不少。
如果在服務器比較多的情況下,配置還是比較繁瑣的。
適用場景
比較適合在聯調或測試環境去用。
2、docker生態
注意,我這里用的是生態二字。docker生態的工具還是比較豐富的,比如docker, harbor,portainer, docker-compose,docker-swarm。
docker
docker有個對自動化部署來說特別好的東西,叫鏡像。這個東西可以把環境,安裝程序,文件資源都打包存儲起來,放到鏡像倉庫,如私服harbor。那這樣鏡像就可以在多臺節點的集群中復用,快速部署。而且鏡像是分層繼承的,這使得容器部署對于環境的復用和擴展就更加靈活。
可以通過dockerfile來制作鏡像,示例如下。也可以基于容器制作鏡像。
# 基于 openjdk:8-jre 為基礎鏡像進行構建
FROM java:8
# 指定進入這個容器的目錄。一般可放到公共的有權限的目錄,比如/usr/local。看鏡像的目錄結構可以進入創建的容器之后去看。
WORKDIR /usr/local/demo3
# 將jar包放入/app目錄下,并重新命名為app.jar
ADD demo-0.0.1-SNAPSHOT.jar app.jar
# 該項目使用的是8081端口,所有需要向外暴漏8081端口,日后才能通過映射的端口去訪問這個暴漏的端口
EXPOSE 8081
# ENTRYPOINT 和 CMD 結合使用,ENTRYPOINT固定命令,CMD根據參數的不同 運行不同的jar包(動態參數)
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]
# 相當于 java -jar xxx.jar
不建議頻繁使用容器提交方式創建鏡像,因為通過提交容器的方式,我們無法追溯詳細的變更操作,這會導致鏡像構建過程缺乏透明度和可重復性。
docker-compose
很適合中小型公司在單臺機器上部署服務。配置靈活方便。結合portainer頁面配合使用特別好用,它在docker的鏡像名是portainer/portainer,可用于管理docker棧、容器、鏡像,還可以用于連接容器命令行。
docker-compose.yml示例如下
#compose版本
version: "3" #微服務項目
services:portainer:#docker可視化界面 image: portainer/portainer:1.24.2container_name: portainerports:- "9000:9000"#數據卷volumes:- /var/run/docker.sock:/var/run/docker.sock- /docker/data/portainer:/datanetworks: - network_testdemo01:#微服務鏡像 image: demo:1container_name: demo01ports:- "9080:9080"#數據卷# volumes:# - /app/microService:/datanetworks: - network_test depends_on: - nginx01- redis- mysql#redis服務nginx01:image: nginx:1.21.5container_name: nginx01ports:- "80:80"volumes:- /docker/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf- /docker/data/nginx/conf/conf.d:/etc/nginx/conf.d- /docker/data/nginx/log:/var/log/nginx- /docker/data/nginx/html:/etc/nginx/htmlnetworks: - network_testrestart: always#redis服務redis:image: redis:6.0.8ports:- "6379:6379"volumes:- /docker/data/redis/redis.conf:/etc/redis/redis.conf- /docker/data/redis/data:/datanetworks: - network_testcommand: redis-server /etc/redis/redis.conf#mysql服務mysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: '123456'MYSQL_ALLOW_EMPTY_PASSWORD: 'no'MYSQL_DATABASE: 'db2024'MYSQL_USER: 'test'MYSQL_PASSWORD: 'test1234'ports:- "3306:3306"volumes:- /docker/data/mysql/db:/var/lib/mysql- /docker/data/mysql/conf/my.cnf:/etc/my.cnf- /docker/data/mysql/init:/docker-entrypoint-initdb.dnetworks:- network_testcommand: --default-authentication-plugin=mysql_native_password #解決外部無法訪問#創建自定義網絡
networks: network_test:
docker-swarm
一個類似于k8s的云原生集群部署工具。支持容器編排、自動擴縮容、自我故障恢復等等,相當強大,雖然支持的節點有上限,但除了一線互聯網公司的業務規模,需求上中小型公司基本都能滿足了。
優點
尤其docker-compose和docker-swarm很適合服務多的時候使用,部署效率高。
缺點
鏡像的制作比較麻煩,比如編寫dockerfile制作,很容易語法出錯,學習成本較高。
鏡像庫需要額外配置,通過harbor搭建私庫,或者通過國內公共鏡像庫。但是公共鏡像庫要么有網速問題,要么有鏡像版本比較老的問題。
鏡像中不適合放太多東西,不然鏡像就會很大。比如把git拉取代碼,maven構筑放進去,那么代碼和依賴的倉庫都很大,所以只適合放環境、環境參數、安裝程序和其他比較輕量的東西。
docker-compose使用比較局限,只能單機。集群架構要配合docker-swarm一起用。
適用場景
生產環境或服務節點多的場景
三、使用感想
總結,jenkins用war包形式運行很方便,而且使用jenkins通過git拉取代碼和maven打包springboot微服務也很方便。
docker生態在集群管理,自動化擴容縮容,交付物和環境的復用等方面很牛。
我在想如果兩者結合一下應該有不錯的使用體驗,比如通過jenkins打包,發布到其中一臺或多臺服務器,然后通過docker來發布鏡像,容器的部署。還有,maven有集成docker鏡像制作和發布的插件,可以通過maven命令進行鏡像的發布,所以完全能這么干,我猜想很多公司也這么干了。