文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

docker封装Spring Cloud(单机版)

2023-01-31 08:27

关注

微服务统一在一个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

 

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

环境介绍

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


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯