Spring Cloud + Docker Swarm 演示环境
Docker Registry v2 – 部署在CentOS-101上
Spring Cloud 项目 – MallManagement
项目源代码github:
https://github.com/rickiechina/microservice-mallmanagement
第一步,构建镜像,并上传到registry 仓库
1. 设置 Docker的insecure-registries 属性,支持Docker Client 端推送images 镜像
如不按照上述设置该属性,Docker Client 推送 Images 将产生如下异常:
docker registry push错误“server gave HTTP response to HTTPS client”
解决方法:
在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:
{ “insecure-registries”:[“192.168.56.101:5000”] }
[root@local ~]# vim /etc/docker/daemon.json
重启 docker:
[root@local ~]# systemctl daemon-reload
[root@local ~]# systemctl restart docker.service
验证insecure-registries 添加成功:
[root@local ~]# docker info
2. 对整个MallManagement 项目,进行maven build 操作:(可略过)
mvn clean package — 仅仅构建 jar 包,验证代码是否正常。
[INFO] microservice-mallmanagement 0.0.1-SNAPSHOT ……… SUCCESS [ 1.553 s]
[INFO] microservice-eureka-server ……………………. SUCCESS [ 6.306 s]
[INFO] microservice-gateway-zuul …………………….. SUCCESS [ 2.164 s]
[INFO] microservice-orderservice …………………….. SUCCESS [ 4.694 s]
[INFO] microservice-userservice 0.0.1-SNAPSHOT ………… SUCCESS [ 2.384 s]
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 18.801 s
[INFO] Finished at: 2018-06-08T13:09:48+08:00
3. Docker Client(在Windows 10 系统)向 Docker Registry 推送镜像:(可略过)
针对单个项目,构建 image镜像。注意:需要在子项目的根目录下面,执行下面的命令,不能在项目的根目录。
D:GithubSpringCloudDockermicroservice-mallmanagementmicroservice-eureka-server>mvn dockerfile:build
下面是构建 eureka server image 镜像。
[INFO] Detected build of image with id 47302f5bfdea
[INFO] Building jar: D:GithubSpringCloudDockermicroservice-mallmanagementmicroservice-eureka-servertargetmicroservice-eureka-server-0.0.1-SNAPSHOT-docker-info.jar
[INFO] Successfully built 192.168.56.101:5000/microservice-eureka-server:0.0.1-SNAPSHOT
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 17.412 s
[INFO] Finished at: 2018-06-08T13:14:26+08:00
[INFO] ————————————————————————
如上述命令出现异常,也可以通过 docker build 命令行,手工构建镜像(需要到dockerfile 子项目目录下执行):
D:GithubSpringCloudDockermicroservice-mallmanagementmicroservice-eureka-server>docker build -t 192.168.56.101:5000/microservice-eureka-server:0.0.1-SNAPSHOT .
可以略过下面的步骤,直接使用 mvn clean install 来完成整个项目的 images 镜像推送。
D:>docker push 192.168.56.101:5000/microservice-eureka-server
The push refers to repository [192.168.56.101:5000/microservice-eureka-server]
bfd212a869c0: Pushed
73ad47d4bc12: Pushed
c22c27816361: Pushed
04dba64afa87: Pushed
500ca2ff7d52: Pushed
782d5215f910: Pushed
0eb22bfb707d: Pushed
a2ae92ffcd29: Pushed
4. mvn clean install — 对整个MallManagement 项目构建images镜像,并推送到 docker registry 中。
D:GithubSpringCloudDocker
microservice-mallmanagement>mvn install 或者 mvn clean install
[INFO] Reactor Summary:
[INFO]
[INFO] microservice-mallmanagement 0.0.1-SNAPSHOT ……… SUCCESS [ 1.481 s]
[INFO] microservice-eureka-server ……………………. SUCCESS [ 23.748 s]
[INFO] microservice-gateway-zuul …………………….. SUCCESS [ 19.344 s]
[INFO] microservice-orderservice …………………….. SUCCESS [ 16.014 s]
[INFO] microservice-userservice 0.0.1-SNAPSHOT ………… SUCCESS [ 35.721 s]
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 01:37 min
[INFO] Finished at: 2018-06-08T14:23:22+08:00
[INFO] ————————————————————————
docker images — 查看构建完成的images 镜像
D:GithubSpringCloudDockermicroservice-mallmanagement>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.56.101:5000/microservice-userservice 0.0.1-SNAPSHOT db5d7e7b3902 About an hour ago 354MB
192.168.56.101:5000/microservice-orderservice 0.0.1-SNAPSHOT 06e8f2c4d4f8 About an hour ago 355MB
192.168.56.101:5000/microservice-gateway-zuul 0.0.1-SNAPSHOT 3b2c1dc25574 About an hour ago 351MB
192.168.56.101:5000/microservice-eureka-server 0.0.1-SNAPSHOT 5e200ceaa8ce About an hour ago 351MB
访问
http://192.168.56.101:5000/v2/_catalog,查看registry 仓库中的镜像列表:
{
repositories: [
“microservice-eureka-server”,
“microservice-gateway-zuul”,
“microservice-orderservice”,
“microservice-userservice”
]
}
第二步,Docker Compose 管理和控制由多个容器所组成的服务项目
1. 使用 docker-compose up 命令,让Docker Compose 完成项目镜像的构建、容器创建、容器启动和容器之间的连接。
D:GithubSpringCloudDockermicroservice-mallmanagement>docker-compose up mallmanagement
可以通过 docker ps 查看启动的容器。
同时,可以使用 docker-compose logs 获得服务日志。
docker-compose logs <service>
查看MallManagement 项目的服务:
Eureka Server:
http://192.168.56.101:8761/
虽然在docker-compose.yml 文件中,有设置order-service和user-service的 replicas =2,但是在 eureka server的UI界面,发现注册的只有1个。
其实,注册的是服务的虚拟IP地址(virtual IP),作为client 访问后端service 的前端入口。Docker 在client和service的工作节点之间路由请求,client 端不必了解服务service有多少个节点,或它们的IP地址和端口。
Docker 1.12通过集群内置的DNS服务实现服务发现,通过vip实现自动负载均衡。
所谓Vip机制,就是docker swarm为每一个启动的service分配一个vip,并在DNS中将service name解析为该vip,发往该vip的请求将被自动分发到service下面的诸多active task上(down掉的task将被自动从vip均衡列表中删除)。
为了更明显地感知有多个 service instances 在运行,可以调整service 的application.yml 配置文件,设置
eureka.instance.instance-ip 的属性值:
eureka:
instance:
prefer-ip-address: true # true – 优选通过IP地址找到对应的服务名称
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
重新构建images镜像,并上传到 registry 仓库,重新启动 docker-compose up 容器。
可以看到如下效果:
访问对应的service url,查看返回结果:
Order Service:
http://192.168.56.101:8050/order-service/order/findOrders/1
User Service:
http://192.168.56.101:8050/user-service/user/findOrders/rickie
第三步,Docker Swarm 进行 Docker 集群管理和容器编排
Swarm 内部的DNS 服务器能确保有一个稳定的名称解析机制。
服务之间都能够通过服务的虚拟 IP 地址(带有负载均衡的服务),来访问到分布的容器。
1. 创建 Docker Swarm 集群
docker swarm init 【单节点的集群】
docker swarm init –advertise-addr IP-ADDR 【IP-ADDR 为集群管理节点】
2. 查看集群节点信息
docker node ls
C:UsersRickie>docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pygc47y3oj9utj1reqpgvjumn * linuxkit-00155d380113 Ready Active Leader 18.03.1-ce
此时,集群中只有一个节点(默认为管理节点)。
Status:指的是节点物理可访问性。如果节点是启动的,显示为 Ready,否则,显示为Down。
Availability:指的是节点可用性。状态可以是 Active(节点正在运行,可以接受任务)、Pause(待命,挂起,不接受任务)、Drain(等待疏散其任务 )。
Manager Status:指的是管理器的当前状态。如果节点不是管理器,该字段为空;如果节点是管理器,该字段可以为 Reachable(待命,保证高可用的管理器之一),或者为Leader(主导所有运营的主机)。
管理很多的管理器和Worker时,务必保证高可用(管理器个数为奇数,大于或者等于3)。
移除管理器
管理器不能强制移除。在移除某个管理器节点时,必须首先将其降级(demote)为worker,兵器疏散其节点上的任务,然后关闭。
docker node demote manager-node
docker node update –availability drain manager-node
# node shutdown
docker node rm manager-node
3. 向 Docker Swarm 集群中添加工作节点
可以使用docker swarm join –token worker 显示如下加入指令:
docker swarm join –token SWMTKN-1-50fiib3awfd9282eqq9cpo1evji1t7ieh2pgntrtfo2uskentq-4f0tl8wh3m0lkaiw98llwvm32 192.168.56.101:2377
【Swarm v2 使用2377 作节点发现,端口2377 是Swarm v2节点用来发现集群里的其他节点的。】
在join 2 台docker node之后,再次查看node 节点信息,总共有3台。
访问 visualizer UI 服务:
http://192.168.56.101:8081/
可以查看服务实例在每个node节点上的部署情况。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!