一、概述

微服务统一在一个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,使用自由风格

通用配置

参数化构建

源码管理

构建

执行shell

完整内容如下:

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

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

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

docker封装Spring Cloud(单机版)的更多相关文章

  1. 如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目

    如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目 #1:前提准备 1.1 首先请确认你的电脑是windows10专业版或企业版,只有这 ...

  2. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  3. 使用docker发布spring cloud应用

    本文涉及到的项目: cloud-simple-docker:一个简单的spring boot应用 Docker是一种虚拟机技术,准确的说是在linux虚拟机技术LXC基础上又封装了一层,可以看成是基于 ...

  4. SpringCloud教程 | 第十一篇: docker部署spring cloud项目

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://blog.csdn.net/forezp. http://blog.csdn.net/forezp/art ...

  5. docker发布spring cloud应用

    原文地址:http://www.cnblogs.com/skyblog/p/5163691.html 本文涉及到的项目: cloud-simple-docker:一个简单的spring boot应用 ...

  6. 史上最简单的SpringCloud教程 | 第十一篇: docker部署spring cloud项目

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2017/07/12/sc11-docker/ 本文出自方志朋的博客 一.docker简介 ...

  7. SpringCloud 教程 (四) docker部署spring cloud项目

    一.docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...

  8. Spring Cloud 与 Dubbo、Spring Cloud 与 Docker、Spring Cloud 与 Kubernetes 比较

    出处:http://dockone.io/article/4142

  9. 玩转SpringCloud Spring Cloud 微服务

    Spring Cloud 简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

随机推荐

  1. 机器学习算法之Kmeans算法(K均值算法)

    Kmeans算法(K均值算法) KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑 ...

  2. Educational Codeforces Round 43

    Educational Codeforces Round 43  A. Minimum Binary Number 显然可以把所有\(1\)合并成一个 注意没有\(1\)的情况 view code / ...

  3. Tomacat目录以及服务器配置文件信息

    一. 1.Tomacat的启动: 在我的windows10中我下载的是8.5版本的tomacat,我就是通过".sh"文件来打开和关闭tomacat 要打开.sh文件还需要 这个G ...

  4. 微软大楼设计方案(中等) 推公式+RMQ问题

    近日,微软新大楼的设计方案正在广泛征集中,其中一种方案格外引人注目.在这个方案中,大楼由 nn 栋楼组成,这些楼从左至右连成一排,编号依次为 11 到 nn,其中第 ii 栋楼有 h_ih​i​​层. ...

  5. XCTF攻防世界web进阶练习—mfw

    XCTF攻防世界web进阶练习-mfw题目为mfw,没有任何提示.直接打开题目,是一个网站 大概浏览一下其中的内容,看到其中url变化其实只是get的参数的变化查看它的源码,看到有一个?page=fl ...

  6. Android Jetpack All In One

    Android Jetpack All In One 在2018年,我们推出了Android Jetpack作为一组库,以帮助开发人员遵循最佳实践,减少样板代码以及编写可在Android版本和设备之间 ...

  7. JavaScript & Atomics

    JavaScript & Atomics Atomics 对象提供了一组静态方法对 SharedArrayBuffer 和 ArrayBuffer 对象进行原子操作. Atomics.add ...

  8. after upgrade macOS Catalina bugs

    after upgrade macOS Catalina bugs 升级了macOS catalina后,碰到的 bugs? macOS 10.15.5 https://www.apple.com/m ...

  9. Learning JavaScript with MDN (call, apply, bind)

    Learning JavaScript with MDN (call, apply, bind) call, apply, bind Object.prototype.toString() 检测 js ...

  10. codesign wants to access key 密码是什么

    codesign wants to access key 密码是什么 真正的是开机密码,不是 apple id 密码 https://developer.apple.com/forums/thread ...