Ubuntu下Jenkins+Docker自動化部署spring cloud項目


環境說明:

  • 操作系統: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微服務

使用docker-compose運行springcloud項目

解決無法遠程登錄Docker中的MySQL


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM