一、概述

微服务统一在一个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. A - 最长回文(马拉车算法//manacher)

    给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为一 ...

  2. Codeforces Round #677 (Div. 3) G. Reducing Delivery Cost(dijkstra算法)

    题目链接:https://codeforces.com/contest/1433/problem/G 题解 跑 \(n\) 遍 \(dijkstra\) 得到任意两点间的距离,然后枚举哪一条边权为 \ ...

  3. c语言中qsort函数的使用、编程中的一些错误

    qsort()函数: 功能:相当于c++sort,具有快排的功能,复杂度的话nlog(n)注:C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法.两者的时间复杂度都是nlog ...

  4. 2017, X Samara Regional Intercollegiate Programming Contest M. Last Man Standing (贪心,双指针)

    题意:有\(n\)个吃鸡玩家,在某个时间段给你他们每个人的杀敌数,判断数据是否合法,并输出每个人对应的杀敌情况. 题解:刚开始写的是直接暴力枚举,向后去找并且标记,然后存到vector最后输出,结果一 ...

  5. PowerShell随笔1---背景

    既然是随笔,那就想到什么说什么,既会分享主题知识,也会分享一些其他技巧和个人学习方法,供交流. 我一般学习一个东西,我都会问几个问题: 这东西是什么? 这东西有什么用,为什么会出现,出现是为了解决什么 ...

  6. hutool学习总结

    1. 为什么要学习Hutool的使用 Hutool官网 中文写的已经很清楚了 Hutool是一款强力的工具类.封装了工作开发中一些常见的功能操作.避免重复造轮子,使用它大大提高的开发效率. 2. Hu ...

  7. Chapter Zero 0.2.3 显示适配器

    显示适配器(Video Graphics Array,VGA) 不看后悔!!深入了解显卡!!!走你! 我们常常会调试显示器的分辨率,一般对于图像的显示重点在于分辨率与颜色深度, 每个图像显示的颜色会占 ...

  8. Kubernets二进制安装(1)集群,软件,IP规划

    1.Kubernetes节点信息情况 主机名 简称 角色 IP地址 操作系统 mfyxw10.mfyxw.com mfyxw10 K8S代理节点1 192.168.80.10 CentOS7.7 mf ...

  9. 为树莓派3B添加LCD1602液晶屏

    树莓派3B针脚说明 LCD1602接线说明 VSS,接地VDD,接5V电源VO,液晶对比度调节,接电位器中间的引脚,电位器两边的引脚分别接5V和接地.RS,寄存器选择,接GPIO14RW,读写选择,接 ...

  10. select函数详细用法解析

    1.表头文件 #include #include #include 2.函数原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set ...