zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    subprocess 子进程模块
    3.5 魔法方法
    ThinkPHP中,display和assign用法详解
    linux常用指令
    退出当前Mysql使用的db_name 的方式
    PHP中GD库是做什么用的? PHP GD库介绍11111111
    include跟include_once 以及跟require的区别
    全局变量跟局部变量
    关于define
    创建、删除索引---高级部分
  • 原文地址:https://www.cnblogs.com/ZYTZ/p/13336823.html
Copyright © 2011-2022 走看看