docker封装Spring Cloud(单机版)

发布时间:2020-03-31 10:32:03编辑:admin阅读(2809)

    一、概述

    微服务统一在一个git项目里面,项目的大致结构如下:

    ./
    ├── auth-server
    │   ├── pom.xml
    │   └── src
    ├── common
    │   ├── pom.xml
    │   └── src
    ├── config-server
    │   ├── pom.xml
    │   └── src
    ├── eureka-server
    │   ├── pom.xml
    │   └── src
    ├── gateway
    │   ├── pom.xml
    │   └── src
    ├── pom.xml
    └── service-user
        ├── pom.xml
        └── src

    主要有5个微服务器,分别是eureka,config,auth,user,gateway

     

    二、封装docker镜像

    dockerfile

    先来介绍eureka-server服务的dockerfile,其他微服务也是类似的,只不过jar包名和端口不一样,其他的都一样。

    内容如下:

    FROM mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk
    ADD repositories /etc/apk/repositories
    ADD eureka-server.jar /
    ADD run.sh /
    RUN chmod 755 run.sh && mkdir -p /data/log/tomcat && apk update && apk add git
    
    EXPOSE 8761
    ENTRYPOINT [ "/run.sh"]

    解释:

    这里使用基础镜像为:mayan31370/openjdk-alpine-with-chinese-timezone:8-jdk

    它使用的是openjdk-8,解决了中文乱码问题,时区问题等等。

    /etc/apk/repositories 是alpine系统的更新源配置。相当于ubuntu的/etc/apt/soure.list

    eureka-server.jar 是eureka微服务打的jar包

    run.sh 是eureka微服务启动命令,由于命令过程,写在了shell脚本里面

    RUN 里面写了一些命令,主要是添加脚本执行权限,创建日志目录,由于eureka微服务写的日志是这个,因此需要提前创建。

    由于config微服务器,需要从gitlab拉取配置文件,因此还需要安装git命令才能执行:git clone http://xxx。

    EXPOSE 是这容器需要暴露的端口

    ENTRYPOINT 表示容器里面的服务器启动命令

     

    repositories

     这个采用的的是阿里云的更新源

    #aliyun
    https://mirrors.aliyun.com/alpine/v3.6/main/
    https://mirrors.aliyun.com/alpine/v3.6/community/

    run.sh

    这个是Java应用的启动命令

    #!/bin/sh
    java -Xms${JVM} -Xmx${JVM} -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=256m -jar /eureka-server.jar

    这里有一个jvm变量,待会docker启动时,会传入此变量。

     

    构建镜像

    上面介绍的几个文件,都在eureka-server目录。进入此目录,使用build命令构建

    cd eureka-server
    docker build -t eureka-server:1 .

    运行镜像

    先创建网桥,1台服务器只需要创建一次即可。

    再运行容器

    docker network create testnet
    docker run -it -d --restart=always --name eureka-server --network testnet --network-alias eureka-server -p 8761:8761 -v /data/log/tomcat:/data/log/tomcat -e JVM=128m eureka-server:1

    三、jenkins发布java项目

    环境介绍

    gitlab版本:GitLab 社区版 10.5.1 

    jenkins版本:2.219

    服务器:centos 7.6(单机)

     

    由于jenkins服务器的操作系统为:centos 6.9,它不能安装docker,因此docker打包动作需要在服务器上面执行。

    ansible分组

    vi /etc/ansible/hosts

    内容如下:

    [test_java]
    192.168.28.34

     

    ansible playbook

    发布模板

    vi /opt/ansible/test/docker_java.yml

    内容如下:

    ---
     # 需要传入变量HOSTS,ENV,PROJECT_NAME,PREFIX,PORT,JVM
     # 分别表示: 主机, 环境,项目名,路径前缀(拼接jenkins jar包路径),端口,jvm大小
     - hosts: "{{ HOSTS }}"
       remote_user: root
       become: yes
       become_method: sudo
       # 声明变量
       vars:
         # 远程项目基础目录
         BASE_DIR: "/data/code"
         # 远程项目目录名
         PROJECT_DIR: "{{ ENV }}_{{ PROJECT_NAME }}_{{ PORT }}"
         # 完整的jenkins 项目跟路径
         JENKINS_DIR: "/data/jenkins_data/workspace/{{ JOB_NAME }}/{{ PREFIX }}"
       tasks:
        #删除原来的包
         - name: move old package
           file: path={{ BASE_DIR }}/{{ PROJECT_DIR }}/{{ PROJECT_NAME }}.jar state=absent
        #同步jar包到目标服务器
         - name: synchronous jar packet
           synchronize:
             src: "{{ JENKINS_DIR }}/target/{{ PROJECT_NAME }}.jar"
             dest: "{{ BASE_DIR }}/{{ PROJECT_DIR }}/"
        #复制jmx_exporter文件
         - name: copy repositories
           shell: \cp /data/alpine/repositories {{ BASE_DIR }}/{{ PROJECT_DIR }}/
        #同步dockerfile到目标服务器
         - name: synchronous dockerfile
           synchronize:
             src: "{{ JENKINS_DIR }}/dockerfile"
             dest: "{{ BASE_DIR }}/{{ PROJECT_DIR }}/"
        #同步run.sh到目标服务器
         - name: synchronous run.sh
           synchronize:
             src: "{{ JENKINS_DIR }}/run.sh"
             dest: "{{ BASE_DIR }}/{{ PROJECT_DIR }}/"
    
        # 打包镜像
         - name: docker build
           shell: cd {{ BASE_DIR }}/{{ PROJECT_DIR }} && docker build -t {{ PROJECT_NAME }}:{{ BUILD_NUMBER }} .
        #删除之前的docker
         - name: docker rm image
           shell: docker rm -f {{ PROJECT_NAME }}
           ignore_errors: yes
    
        #启动docker
         - name: docker run image
           # # 提前创建bridge网络:docker network create testnet
           shell: docker run -it -d --restart=always --name {{ PROJECT_NAME }} --network testnet --network-alias {{ PROJECT_NAME }} -p {{ PORT }}:{{ PORT }} -v /data/log/tomcat:/data/log/tomcat -e JVM={{ JVM }} {{ PROJECT_NAME }}:{{ BUILD_NUMBER }}
         - name: view port,Wait for 55 seconds
           shell: sleep 55;docker exec {{ PROJECT_NAME }} netstat -anpt|grep {{ PORT }}

     

    回滚模板

    vi /opt/ansible/test/docker_java_rollback.yml

    内容如下:

    ---
     # 需要传入变量HOSTS,PROJECT_NAME,PORT,JVM,BUILD_ID
     # 分别表示: 主机, 项目名,端口,jvm大小,回滚的构建ID
     - hosts: "{{ HOSTS }}"
       remote_user: root
       become: yes
       become_method: sudo
    
       tasks:
        #删除之前的docker
         - name: docker rm image
           shell: docker rm -f {{ PROJECT_NAME }}
           ignore_errors: yes
    
        #启动docker
         - name: docker run image
           # # 提前创建bridge网络:docker network create testnet
           shell: docker run -it -d --restart=always --name {{ PROJECT_NAME }} --network testnet --network-alias {{ PROJECT_NAME }} -p {{ PORT }}:{{ PORT }} -v /data/log/tomcat:/data/log/tomcat -e JVM={{ JVM }} {{ PROJECT_NAME }}:{{ BUILD_ID }}
         - name: view port,Wait for 55 seconds
           shell: sleep 55;docker exec {{ PROJECT_NAME }} netstat -anpt|grep {{ PORT }}

     

    新建job

    新建一个job,名字为:test_eureka_server,使用自由风格

    通用配置

    1.png

     

    参数化构建

    1.png

     

     源码管理

    1.png

     

     构建

     1.png

     

     执行shell

    1.png

     

    完整内容如下:

    case $Status  in
      Deploy)
        echo "Status:$Status"
        ansible-playbook -v /opt/ansible/test_java.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_NUMBER=${BUILD_NUMBER} ENV=test PROJECT_NAME=eureka-server PREFIX=eureka-server PORT=8761 JVM=128m"
        echo "Completing!"
        ;;
      Rollback)
        echo "Status:$Status"
        echo "BUILD_ID:$BUILD_ID"
        ansible-playbook -v /opt/ansible/test_java_rollback.yml -e "HOSTS=test_java JOB_NAME=${JOB_NAME} BUILD_ID=${BUILD_ID} PROJECT_NAME=eureka-server PORT=8761 JVM=128m"
        echo "Completing!"
        ;;
      *)
      exit
        ;;
    esac

     

    点击最下面的保存,最后点击构建即可

    1.png

     

     发布时,build_id无需填写。回滚时,选择Rollback,输入指定的build_id即可。

    1.png


关键字