首页 > 其他 > 详细

docker-swarm的运用

时间:2021-04-12 22:25:54      阅读:41      评论:0      收藏:0      [点我收藏+]

上篇博客 写了如何使用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.

 

之后再次查看集群状态

技术分享图片

 

 集群已移除!

 

docker-swarm的运用

原文:https://www.cnblogs.com/kanyun/p/14649115.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!