環境說明:
- 操作系統:Ubuntu 18.04 64位(阿里雲服務器)
- Jenkins:2.235.1
- Docker:19.03.12
說明:
默認你的服務器已經安裝了docker、Jenkins環境(沒裝的可以參考我上一篇),spring cloud項目代碼已經提交到倉庫。
下面進行Jenkins的配置以及項目中docker相關配置文件說明。
1.項目中Dockerfile,以及docker-compose.yml文件說明
聚合項目的每個子模塊下都創建一個Dockerfile,用於后續構建docker image。
FROM java:8 #VOLUME /tmp ADD target/api-gateway-1.0.0-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","app.jar"] EXPOSE 5555
每個子模塊的Dockerfile可以參考上面的代碼,jar包名稱需要根據你的項目進行調整。
然后整個項目的根目錄下創建docker-compose.yml,用於后續利用docker compose進行多容器的管理。
version: "3" services: eureka-server : image: eureka-server ports: - "1111:1111" # volumes: # - /usr/local/cloud/logs/eureka-server:/logs networks: - my-cloud feign-consumer: image: feign-consumer ports: - "9002:9002" # volumes: # - /usr/local/cloud/logs/provider:/logs networks: - my-cloud depends_on: - eureka-server api-gateway: image: api-gateway ports: - "5555:5555" # volumes: # - /usr/local/cloud/logs/consumer:/logs networks: - my-cloud depends_on: - eureka-server booking-service: image: booking-service ports: - "8080:8080" # volumes: # - /usr/local/cloud/logs/consumer:/logs networks: - my-cloud depends_on: - eureka-server mysql: image: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: databaseName volumes: - /home/Booking-Center/mysqlData:/var/lib/mysql networks: - my-cloud networks: my-cloud: driver: bridge
2.服務器docker compose的安裝:
root@Colin:~# sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 617 100 617 0 0 695 0 --:--:-- --:--:-- --:--:-- 694 100 16.3M 100 16.3M 0 0 113k 0 0:02:27 0:02:27 --:--:-- 368k sudo chmod +x /usr/local/bin/docker-compose root@Colin:~# docker-compose --version docker-compose version 1.25.4, build 8d51620a
3.Jenkins相關配置:
安裝maven插件
點擊左邊Manage Jenkins --> Manage Plugins --> available 上面搜索maven,選擇然后install without restart,我這里已經安裝過了
選擇安裝maven版本
點擊左邊Manage Jenkins --> Global Tool Configuration,拉到頁面最下方,名字隨意,然后save
新建一個maven項目
Post Steps增加構建步驟,shell腳本:Add post-build step -> execute shell
在command中添加以下shell腳本:
#docker運行服務URL #操作/項目路徑(Dockerfile存放的路勁) BASE_PATH=/var/lib/jenkins/workspace # 源項目工作空間 #SOURCE_PATH=/var/lib/jenkins/workspace #docker 鏡像路徑,也是父項目路徑 PARENT_PATH=Booking-Center #docker 鏡像/容器/項目名字或者jar名字數組 這里都使用項目名命名 PROJECT_NAMES=("eureka-server" "feign-consumer" "api-gateway" "booking-service") #項目版本號/docker 容器tag,使用項目版本號來做tag,版本號要與項目數組PROJECT_NAMES一一對應 PROJECT_VERSIONS=("1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT" "1.0.0-SNAPSHOT") #docker容器暴露的端口,端口號要與項目數組PROJECT_NAMES一一對應,這里為了簡化,docker容器端口與宿主機端口配置成一樣的。 EXPOSE_PORTS=("1111" "9002" "5555" "8080") ##############以下內容不用修改 DATE=`date +%Y%m%d%H%M` #創建項目環境目錄 function projectDir(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do if [ ! -e $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} ] && [ ! -d $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} ]; then mkdir -p $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} echo "Create Dir: $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]}" fi done } # 構建docker鏡像 function build(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do #鏡像id IID=$(docker images | grep "${PROJECT_NAMES[$i]}" | awk '{print $3}') if [ -n "$IID" ]; then echo "存在${PROJECT_NAMES[$i]}鏡像,IID=$IID" echo "刪除${PROJECT_NAMES[$i]}鏡像..." docker rmi $IID echo "重新構建鏡像" cd $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} docker build -t ${PROJECT_NAMES[$i]} . else echo "不存在${PROJECT_NAMES[$i]}鏡像,開始構建鏡像" cd $BASE_PATH/$PARENT_PATH/${PROJECT_NAMES[$i]} docker build -t ${PROJECT_NAMES[$i]} . fi done } function delContainer(){ for (( i = 0 ; i < ${#PROJECT_NAMES[@]} ; i++ )) do #容器id CID=$(docker ps -a | grep "${PROJECT_NAMES[$i]}" | awk '{print $1}') if [ -n "$CID" ]; then echo "存在${PROJECT_NAMES[$i]}容器,CID=$CID,停止並刪除docker容器 ..." docker rm -f $CID echo "${PROJECT_NAMES[$i]}容器停止刪除完成" else echo "不存在${PROJECT_NAMES[$i]}容器" fi done } # 運行docker容器 function run(){ projectDir delContainer build #啟動容器,我們采用docker compose來編排docker容器,解決docker容器之間網絡訪問的問題 #先編寫docker-compose.yml文件后,放入項目路徑下 cd $BASE_PATH/$PARENT_PATH docker-compose up -d } #入口 run
save之后開始構建,查看控制台輸出:
4.設置能夠遠程登錄docker中的MySQL:
docker exec -it [mysql] /bin/bash mysql -u root -p ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; flush privileges; exit;
參考過的博客:
微服務架構持續集成:(四)通過jenkins + docker 部署spring cloud微服務