写在前面
本文的读者适合,devops/运维/测试/开发;
需要掌握知识:
1、Docker 的安装 已经简单使用
2、Docker-compost安装及使用,懂得yml文件结构语法及docker-compost文件编排服务的语法;
3,registry(镜像仓库) 安装、上传、下载。
什么问题
通过上篇Jenkins/git/maven/ssh/docker案例
我们来解释一下部署的流程
问题:
1、只能部署在一台宿主机上,一旦宿主机挂了GG 思密达;
2、不能满足容器之间可以通信的要求(虽然可以使用docker的方式解决 但是配置复杂)
3、不利于维护和扩展,我们一个应用可能要部署一个数据库、一个app 、redis等等;
解决方案
使用swarm实现跨宿主机容器服务编排
案例介绍
使用jenkins,Docker,swarm,registry,实现eureka服务高可用集群;
注册发现组件eureka配置
server.port = 8761
eureka.instance.hostname =本地主机
eureka.client.registerWithEureka = FALSE
eureka.client.fetchRegistry = FALSE
eureka.client.serviceUrl.defaultZone = ${EUREKA_SERVER_LIST}
dockerFile文件
FROM java
ADD Sping-Cloud-eureka-Server-0.0.1-SNAPSHOT.jar /usr/src/myapp/eureka.jar
ENTRYPOINT ["java","-jar","/usr/src/myapp/eureka.jar"]
DockerCompost.yml
#使用dockercompost 3版本进行编写 遵守3版本的语法
version: '3'
#services 表示服务的列表总称 证明之下的节点都是关于每一个service的配置
services:
#在 services 标签下的第二级标签是 eureka1,这个名字是用户自己自定义,它就是服务名称 也是主机hostname名称。
eureka1:
# eureka1服务的子节点image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: 192.168.19.132:5000/java:euraka
# eureka1服务的子节点网络 说明这个eureka1服务需要加入的网络组名称是eureka-overlay,可以指定任意名称
networks:
eureka-overlay:
#特别的子标签aliases,这是一个用来设置服务别名的标签都是eureka,对于客户端可以在配置文件中指定这个别名即可,不必指定三个示例的名字
aliases:
- eureka
#映射的端口列表,在swarm集群中所有的节点都必定会被映射
ports:
- "8761:8761"
#环境变量
environment:
- EUREKA_SERVER_LIST=http://eureka2:8761/eureka/,http://eureka3:8761/eureka/
eureka2:
image: 192.168.19.132:5000/java:euraka
networks:
eureka-overlay:
aliases:
- eureka
ports:
- "8762:8761"
environment:
- EUREKA_SERVER_LIST=http://eureka1:8761/eureka/,http://eureka3:8761/eureka/
eureka3:
image: 192.168.19.132:5000/java:euraka
networks:
eureka-overlay:
aliases:
- eureka
ports:
- "8763:8761"
environment:
- EUREKA_SERVER_LIST=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
networks:
eureka-overlay:
#外部的、、资料没找到推测可能是其他节点需要有swarw来创建这个Network
external:
name: eureka-overlay
shell脚本
#! /bin/bash
#网络名称
networkname="eureka-overlay"
#编排文件
docker_compost_yml="eureka.yml"
#创建的image_name
build_image_Name="java:euraka"
#工作目录
Work_dir="/honme"
#image——tag
Docker_image_tag="192.168.19.132:5000/java:euraka"
#服务列表
Service_names="java_eureka1 java_eureka2 java_eureka3"
cd ${Work_dir}
echo cd ${Work_dir}
docker build -t ${build_image_Name} .
docker tag ${build_image_Name} ${Docker_image_tag}
docker push ${Docker_image_tag}
docker service ls
for service in $Service_names;
do
docker service rm $service
done
docker network rm ${networkname}
docker network create -d overlay ${networkname}
docker network ls
docker stack deploy -c ${docker_compost_yml} java
for service in $Service_names;
do
docker service ps $service
echo $service
done
docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")
rm -rf /home/Sping-Cloud-eureka-Server-0.0.1-SNAPSHOT.jar
rm -rf /home/Dockerfile
rm -rf /home/eureka.yml
docker service ls
docker node ls
执行需求
1、jenkins服务可正常打包
2、Linux 机器3台 均已安装最新的docker版本,修改hostname 为 master 、Node1、Node2、并可ssh访问
3、master安装进行swarm初始化、Node节点加入
4、master安装registry镜像仓库;
执行过程
1、Jenkins将打好的包及dockerCompost.yml 、Dockerfile 、dockershell脚本拷贝至master主机
2、执行shell脚本逻辑自动进行服务编排打包;
2.1 根据dockerfile build 新的镜像
2.2 将新的镜像上传到registry仓库;
2.3根据 dockerCompost.yml 执行服务编排
执行效果
1、在任何节点的IP+端口,都可以被访问到服务、哪怕那个节点没有部署对应的服务也可以访问;
2、服务被分别部署到不同的节点;
3、容器之间通信正常;