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

原文地址:https://www.cnblogs.com/ZYTZ/p/13336823.html