1. 程式人生 > 實用技巧 >Ubuntu下Jenkins+Docker自動化部署spring cloud專案

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 -->ManagePlugins --> 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