Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。

  swarm架构图

  多个manager节点就会涉及到状态的同步,docker swarm采用的是内置的分布式存储的数据库,采用raft协议去同步多个manager之间的状态,防止脑裂情况发生。

  业务一般都会运行在worker节点上(manager也是可以运行的),多个worker节点之间数据和状态会通过gossip的网络同步。

20.1 service和replicas

  docker swarm中,service的概念和docker compose中的service概念是差不多的。

  replicas是在service的基础上做横向扩展,例如,一个nginx的swevice中有三个nginx的容器,其中每一个容器就可以理解为一个replica。

20.2 swarm服务的创建和调度

  swarm中通过manager节点去部署一个service的时候,我们事先是不知道这个service最终会运行在哪些swarm的cluster节点上的,swarm的scheduler会根据一定的调度算法去计算(比如会根据每台cluster节点的资源使用率等),将容器调度在相应的节点上。

  swarm服务创建和调度图:

20.3 创建一个三节点的swarm集群

  初始化一个集群,宣告manager节点地址:

swarm-manager

docker swarm init --advertise-addr=192.168.205.10

Swarm initialized: current node (xyl16kq5aj71sbqccys1jsoyv) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-5igsd3yoz1hm8z39q0emtgx4ot0ei31vgv8kkvy1jybxwd8286-0lewqgbggwmhrpclt7myjvuu9 192.168.205.10:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

  到此为止,docker swarm的manager节点创建完成,可以通过提示在worker节点上运行下面的命令即可在这个manager节点中添加worker节点:

docker swarm join --token SWMTKN-1-5igsd3yoz1hm8z39q0emtgx4ot0ei31vgv8kkvy1jybxwd8286-0lewqgbggwmhrpclt7myjvuu9 192.168.205.10:2377

swarm-worker1

docker swarm join --token SWMTKN-1-5igsd3yoz1hm8z39q0emtgx4ot0ei31vgv8kkvy1jybxwd8286-0lewqgbggwmhrpclt7myjvuu9 192.168.205.10:2377

This node joined a swarm as a worker.

swarm-manager

  通过docker node ls查看当前的swarm的节点信息:

docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
xyl16kq5aj71sbqccys1jsoyv * swarm-manager Ready Active Leader 18.03.1-ce
r2mh5nz1k7d765j6zxj3e1hgf swarm-worker1 Ready Active 18.03.1-ce

swarm-worker2

docker swarm join --token SWMTKN-1-5igsd3yoz1hm8z39q0emtgx4ot0ei31vgv8kkvy1jybxwd8286-0lewqgbggwmhrpclt7myjvuu9 192.168.205.10:2377

This node joined a swarm as a worker.

swarm-manager

docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
xyl16kq5aj71sbqccys1jsoyv * swarm-manager Ready Active Leader 18.03.1-ce
81zzel5tk5im0rmp98xi306qa swarm-worker1 Ready Active 18.03.1-ce
r2mh5nz1k7d765j6zxj3e1hgf swarm-worker2 Ready Active 18.03.1-ce

20.4 swarm中service的创建和维护

创建service

  通过docker service create创建一个服务,类似于docker run命令:

docker service create --name demo busybox sh -c "while true;do sleep 3600;done"

i7jn9sbf4xmdv3t6nl8f7ywp3
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged

  查看已有的service:

docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
i7jn9sbf4xmd demo replicated 1/1 busybox:latest

  通过上面的信息我们不知道demo这个服务的容器运行在哪一台服务器上,但是,可以通过docker service ps service_name来查看:

docker service ps demo

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
ewkxqwwa7u5n demo.1 busybox:latest swarm-manager Running Running 4 minutes ago

  可以发现,demo这个service运行在swarm-manager这个管理节点上。在swarm-manager节点上通过docker ps查看:

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e80a085916b0 busybox:latest "sh -c 'while true;d…" 6 minutes ago Up 6 minutes demo.1.ewkxqwwa7u5ndaaigls3xvts3

service 扩展

  我们通过之前的demo这个service可以看到有一个REPLICAS显示的是1/1,这就说明demo这个service是可以横向扩展的,service的扩展类似于docker compose。也是通过参数scale来实现:

docker service scale demo=5

demo scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged

  查看demo服务:

docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
i7jn9sbf4xmd demo replicated 5/5 busybox:latest

  可以发现REPLICAS已经由1/1变成了5/5。再次查看这5个容器分别运行在哪些节点之上:

docker service ps demo

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
ewkxqwwa7u5n demo.1 busybox:latest swarm-manager Running Running 14 minutes ago
pxdw4jdn5clq demo.2 busybox:latest swarm-manager Running Running 3 minutes ago
5iayi08grmzo demo.3 busybox:latest swarm-worker1 Running Running 2 minutes ago
313zmkgrm933 demo.4 busybox:latest swarm-worker2 Running Running 3 minutes ago
jawwrmdgrey4 demo.5 busybox:latest swarm-worker2 Running Running 3 minutes ago

  通过docker swarm scale创建的横向扩展(比如scale demo=5),那么,无论在哪个节点上强制删除其中一个或者多个该service的容器(dockerd服务必须在运行),docker swarm scale都会自动在当前的集群中的其他容器重新启动相应个数的容器,保持scale指定的数量。这样就可以确保系统稳定,不会出现业务停止的情况。

删除service

  删除一个service只需要通过docker service rm service_name即可,在删除service之后,docker swarm会自动从当前swarm集群中删除该服务之前运行的所有容器(有一定的延时):

docker service rm demo

demo

  删除服务之后,再次查看该服务情况:

docker service ps demo
no such service: demo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  

[root@docker ~]#
[root@docker ~]#
[root@docker ~]#

20、docker swarm的更多相关文章

  1. 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm

    微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合 ...

  2. 九、docker swarm主机编排

    一. 什么是Docker Swarm Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/do ...

  3. 这20个Docker Command,有几个是你会的?

    在这之前呢,也写过两篇关于Docker基础入门类的文章 Docker容器技术入门(一) Docker容器技术入门(二) 很多人都感觉这文章这么简单.这么基础,可是别忘记了"万丈高楼平地起&q ...

  4. Docker Swarm(十一)生产环境使用的一些建议

    一.Docker Swarm上的容器选择 并非所有服务都应该部署在Swarm集群内.数据库以及其他有状态服务就不适合部署在Swarm集群内. 理论上,你可以通过使用labels将容器部署到特定节点上, ...

  5. Docker 三剑客之 Docker Swarm

    上一篇:Docker 三剑客之 Docker Compose 阅读目录: Docker Machine 创建 Docker 主机 Docker Swarm 配置集群节点 Docker Service ...

  6. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

  7. 使用docker swarm集群心得

    本片关于使用docker swarm 集群心得,也是一些经验吧!过程描述可能简单! 根据一些公司使用经历接收一下问题并针对问题作出应对策略 1.docker swarm集群 主节点数必须是单数,也就是 ...

  8. Docker三剑客之Docker Swarm

    一.什么是Docker Swarm Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/s ...

  9. Docker Swarm——集群管理

    前言 之前在总结docker machine的时候,当时对docker理解还不够深入,甚至还不知道 docker machine 与 docker swarm 的区别. 在查阅资料以及官方文档之后,今 ...

随机推荐

  1. 前端知识--------HTML内容

    HTML介绍 1.web服务本质 import socket sk = socket.socket() sk.bind(('127.o.o.1',8080)) sk.listen() while 1: ...

  2. sqlite小知识

    删除数据时,由于缓存关系,数据了文件大小不会一下子减小,可以通过执行vacuum;或新建表时使用自动整理大小来实现. sqlite的大小理论上可以达到140T. 暂时,使用C的api,只能使用不是.开 ...

  3. php Pthread 多线程 (五) 线程同步

    有些时候我们不希望线程调用start()后就立刻执行,在处理完我们的业务逻辑后在需要的时候让线程执行. <?php class Sync extends Thread { private $na ...

  4. dataTables常用参数

    一.新版本和老版本的区别 新版本的改进:https://datatables.net/new/1.10 新老版本参数变化列表:http://datatables.club/upgrade/1.10-c ...

  5. 757A Gotta Catch Em' All!

    A. Gotta Catch Em' All! time limit per test 1 second memory limit per test 256 megabytes input stand ...

  6. 品味性能之道<一>:性能测试思维与误区

           <java performance><品悟性能优化 oracle><面向模式的软件架构-模式系统>读书笔记应用调优分享.      性能问题的解决,首 ...

  7. linux c++连接mysql编译问题

  8. 设计规范VS设计创造力,谁更胜一筹?

    设计规范和设计创造力哪个更重要?这是一个颇具争议性的话题.如果是3年前问我这个问题我会毫不犹豫的选择设计创造力,毫无疑问,一个好的设计创造力真的是可以让人像打了鸡血一样疯狂. 原来在上大学的时候,我就 ...

  9. 设计模式之Adapter设计模式

    这个设计模式是我这两天刚学的,这儿算是我的读书笔记发布出来是供大家一起学习,后面有我自己的感悟,下面是我网上整理的 以下情况使用适配器模式 • 你想使用一个已经存在的类,而它的接口不符合你的需求. • ...

  10. Java代码实现依赖注入

    http://zhangjunhd.blog.51cto.com/113473/126545 这里将模仿Spring实现一种基于xml配置文件的依赖注入机制.文件中将实现3中注入,一是单值注入,包括i ...