上篇博客 写了如何使用docker-compose来部署服务。虽然docker-compose解决了docker间通信问题,但是缺点也是很明显的。就是只能在一台宿主机上通信。我们使用docker-compose在宿主机上部署了20+的应用,宿主机配置 16C 32GB RAM。服务全部启动后,常态内存占用就高达85%。显然是无法应对突发情况的,因此如果服务比较多,仅仅使用docker-compose是不够的。因此我们使用docker-swarm来部署服务。
docker-swarm是docker官方推出的docker集群解决方案,相比与k8s更轻量,因此如果服务不多可以采用docker-swarm来部署服务!
1.初始化集群
[root@zhongjianjian03 ~]# docker swarm init
执行该命令的节点,一般会成为master(leader)节点,之后的一些集群操作命令,也都是在master节点执行。这里一定要注意
注意红线框住的地方,这里给了一个命令,就是其他节点如果要加入集群可以使用这个命令加入。
我这里又找了一台机器,执行了该命令
可以看到当前节点加入到了swarm集群,且作为worker节点。此时
我们可以在master节点查看节点状态了
使用命令。
[root@zhongjianjian03 ~]# docker node ls
可以看到目前集群有两个节点了。且一台master 一台work 即MANAGER STATUS 其实这个字段还有一个值Reachable 这个值的意思是当Leader节点宕机后,会从
Reachable状态的节点,选举一个新Leader节点。
既然集群已经创建好了,那么我们如何部署自己的应用呢?
其实很简单,前面学习的docker-compose的知识可以用到了。
这里先说明一下部署的应用。要部署4个应用。使用docker-swarm在两个节点的情况下,他会给每个节点分配两个应用。最后达成的效果应该是这个四个服务可以互相访问的到。
首先先编写"docker-compose.yml",这里为什么加上了引号,因为严格意义上说我们并不是要使用docker-compose了。
version: ‘3‘
services:
node_a1:
image: xxx/node:v1
networks:
- my-net
ports:
- "8000:8080"
deploy:
replicas: 1
command: java -jar node-a1-1.jar
node_a2:
image: xxx/node:v1
networks:
- my-net
ports:
- "8001:8080"
deploy:
replicas: 1
command: java -jar node-a2-1.jar
node_b1:
image: xxxx/node:v1
networks:
- my-net
ports:
- "8002:8080"
deploy:
replicas: 1
command: java -jar node-b1-1.jar
node_b2:
image: xxx/node:v1
networks:
- my-net
ports:
- "8003:8080"
deploy:
replicas: 1
command: java -jar node-b2-1.jar
networks:
my-net:
driver: overlay
可以看到,我们写了四个应用,这四个应用里面是什么内容呢? 其实就是每个应用访问其他三个应用。需要注意的是。这里使用的网络 是 overlay
接下来就是要发布服务了。使用命令
# 在master节点执行 , stack.yml 就是刚才编辑的"docker-compose.yml"文件 test 是服务名前缀
[root@zhongjianjian03 ~]# docker stack deploy -c stack.yml test
可以看到创建了一个网络,和四个应用。
此时我们可以查看我们的服务有哪些
#mster节点执行 [root@zhongjianjian03 ~]# docker service ls
可以看到我们的服务有哪些。
但其实我关心的是,我的服务在哪个节点上,毕竟我是swarm集群,有两台机器。
其实查找服务在哪个节点,有两种方法,一种是直接在某个节点上执行
docker ps
这样就可以看到执行命令的节点上跑了哪些容器(也即服务)。
节点A
节点B
这样我们就找到了服务对应的机器节点。
你可能会想这样很慢,如果节点很多,那要找一个服务所在的节点不是很慢?
其实还可以使用其他方式,首先查询所有的服务列表
比如我想知道 test_node_b2所在的节点。此时我们现在有了 service id 。我们可以通过命令查到服务所在节点信息
# 在master节点执行
[root@zhongjianjian03 ~]# docker service ps i5xlp60hd4x5
如图,可以看到已经查到了节点信息,可以跟上图做一个比较,发现信息是一致的。
此时,服务都启动了。我们怎么知道服务之前是否互通呢?
很简单,之前我们在编辑“docker-compose.yml”文件时定义了四个服务。
即:node_a1 node_a2 node_b1 node_b2
现在这四个服务分布在了两个机器上。我们任意选择一个机器,选择其中的一个容器进去。
比如我们进入node_a1容器
# 需在容器所在的节点 上执行该命令
[root@zhongjianjian03 ~]# docker exec -it d97765b92136 bash
这样我们就进入了容器内部。
接着我们只需要使用ping 命令就可以知道是否可以互相访问了
从图片可以知道。网络是通的。接着就可以测试自己应用的通过性了,具体就以实际应用为准了
至此docker-swarm集群搭建完毕。可以看到跟docker-compose相比,只是在命令上有些不同,docker-compose需要单独安装,而docker-swarm则需要提前创建集群。
现在我们的应用分布在集群里,就可以方便的进行服务冗余了,当然docker-swarm的命令不止这些,但是缺点也比较明显就是没有可视化的界面可供操作,虽然可以通过安装portainer
来管理swarm集群,但功能上会有局限,并没有k8s强大!
如果不想使用集群了。也可以删除集群。
当前节点状态:
可以看到 AVAILABILITY字段的两个值均是在线状态
删除节点:
# 让 node3 离开,排空 该node 的容器(在 master 上操作)
[root@zhongjianjian03 ~]# docker node update --availability drain i0yhyiotqklaj7626jfavnuky
此时可以看到node的状态
让被移除的node离开集群
# 在被离开的节点上操作
[root@app01 ~]# docker swarm leave
Node left the swarm.
删除node节点
# 在master节点操作
[root@zhongjianjian03 ~]# docker node rm i0yhyiotqklaj7626jfavnuky
此时 节点列表为:
之后我们只需要使用类似的命令就能删掉主节点:
[root@zhongjianjian03 ~]# docker node update --availability drain rsj6jxbm1fwz7dsbn0pxillxj rsj6jxbm1fwz7dsbn0pxillxj [root@zhongjianjian03 ~]# docker swarm leave --force Node left the swarm.
之后再次查看集群状态
集群已移除!
原文:https://www.cnblogs.com/kanyun/p/14649115.html