一、概述

微服务统一在一个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. 矩阵树定理(Kirchhoff || Laplace)初探——Part 1(无向图计数)

    必备知识: 高斯消元,图论基本知识(好像就这...(雾)) 这里是无向图部分,请不要走错场... 定义 我们将邻接矩阵定义为矩阵\(A(u,v)\),我想邻接矩阵就不用再多说了: 我们将每个点的度数矩 ...

  2. 【uva 11491】Erasing and Winning(算法效率--贪心+单调队列)

    题意:有一个N位整数,要求输出删除其中D个数字之后的最大整数. 解法:贪心.(P.S.要小心,我WA了2次...)由于规定了整数的位数,那么我们要尽量让高位的数字大一些,也就是要尽量删去前面小的数字. ...

  3. 2019牛客暑期多校训练营(第四场)k题、j题

    传送门 k题: 题意: 给你一串由数字构成的字符串,你从这个字符串中找子字符串使这个字符串是300的倍数 题解: 这道题和第三场的B题极其相似 首先可以把是三百的倍数分开,必须要是100和3的倍数 是 ...

  4. 动态主席树【带修改】&& 例题 Dynamic Rankings ZOJ - 2112

    参考链接:https://blog.csdn.net/WilliamSun0122/article/details/77885781 一.动态主席树介绍 动态主席树与静态主席树的不同在于:静态主席树不 ...

  5. WPF 之路由事件和附加事件(六)

    一.消息驱动与直接事件模型 ​ 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...

  6. 弹性计算服务(Elastic Compute Service) / 云服务器 ECS

    计费方式选择 多种可选择计算费用的方式,可以包年包月,按流量计费,按资源规格计费(本文第四点)等等 地域位置选择 地域:地域指的是 ECS 实例所在的物理位置 地域位置如何选择: 根据访问业务的用户比 ...

  7. 二进制安装kubernetes(四) kube-scheduler组件安装

    介绍资料转载地址:https://www.jianshu.com/p/c4c60ccda8d0 kube-scheduler在集群中的作用 kube-scheduler是以插件形式存在的组件,正因为以 ...

  8. Please commit your changes or stash them before you merge问题解决

    问题描述 error: Your local changes to the following files would be overwritten by merge: xxx/xxx/xxx.c P ...

  9. codeforces 1C (非原创)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  10. POJ 2923 Relocation(状压DP)题解

    题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...