1. 什么是Docker Swarm?
    Swarm是Docker的一个编排工具,在之前我们只是在一台机器来进行docker的管理:
  2. dockerman教程 docker-swarm_服务器

  3. 但是有时容器并不一定都在一台主机上,如果是分布式的处于多台主机上,这时就可以借助于Swarm,Swarm是Docker自带的编排工具,只要你安装了Docker就会存在Docker Swarm工具。
  4. dockerman教程 docker-swarm_docker_02

  5. Swarm中的模式是有两大类节点,一类是manager节点,另一类是worker节点,manager节点相当于对服务的创建和调度,worker节点主要是运行容器服务,当然manager节点也是可以运行的。
  6. dockerman教程 docker-swarm_Docker_03

  7. manager节点状态、信息的同步根据Raft consensus group(Raft一致性算法)的网络进行通信同步的,而worker之间的通信依靠的是Gossip network(Gossip协议是电脑之间的通信协议)做到的。
    另外一个重要的概念就是service,我们可以在一个manager节点上创建一个服务,但是可以根据这一个服务创建多个容器的任务,这些容器任务运行在不同的节点上。
  8. dockerman教程 docker-swarm_Docker_04

  9. 那么如何进行Swarm集群的搭建呢?
          1)在swarm模式下初始化一个Swarm集群,并且将当前主机加入到该集群作为manager节点
          2)加入其它节点到该集群中
          3)部署service到该集群中
  10. Docker Swarm集群搭建,这里我们总共有4台机器,我们准备创建的1主3从
     主节点:192.168.56.10(docker01)
     从节点:192.168.56.11(docker02)
     从节点:192.168.56.12(docker03)
     从节点:192.168.56.13(docker04)
    1)创建多节点集群
           1.1)查看docker-swarm命令
                 
  11. dockerman教程 docker-swarm_服务器_05

  12.             可以看到其中有一个 init的命令,这就是初始化一个Swarm,我们再看看这个init的参数:
                
  13. dockerman教程 docker-swarm_Docker_06

  14.              可以看到它有很多的参数,其中第一个就是将本机的地址添加进去,让自己成为一个Manager节点,这样其它的节点都可以知道这个节点的存在。
    2)创建一个Manager节点
          命令:docker swarm init --advertise-addr=当前机器的ip地址
           
  15. dockerman教程 docker-swarm_服务器_07

  16.       可以看到已经创建了一个swarm manager节点--advertise-addr参数的值192.168.56.10是自己的ip,相当于将自己加入到swarm中。它也说明了其它worker加入的方式。
          其它work加入的命令是:
              docker swarm join --token SWMTKN-1-42k5spdc2goa6lqy2o858uu43x3r6yne03aoaa4267wdxozq1a-9ak1flizh9gckgulxanvjvsqe 192.168.56.10:2377
    3)创建一个worker节点 ,另外再开启一台虚拟机,将这台机器加入到swarm中成为worker节点,这一台机器ip为192.168.56.11
           命令: docker swarm join --token SWMTKN-1-42k5spdc2goa6lqy2o858uu43x3r6yne03aoaa4267wdxozq1a-9ak1flizh9gckgulxanvjvsqe 192.168.56.10:2377
           
  17. dockerman教程 docker-swarm_服务器_08

  18.        可以看到已经成功了。
    4)查看节点状态 ,注意的是查看节点状态只能在manager节点那台机器上查看,普通节点无法执行查看命令:
        命令:docker node ls
         
  19. dockerman教程 docker-swarm_dockerman教程_09

  20.      可以看到有两台机器了。 
    5)这里我们总共有4台机器,我们将剩余两台机器创建好work节点
         
  21. dockerman教程 docker-swarm_服务器_10

  22.      
  23. dockerman教程 docker-swarm_docker_11

  24. 6)在docker01主节点上查看节点状态
         
  25. dockerman教程 docker-swarm_dockerman教程_12

  26.     可以看到有4台机器了。 
    7)多节点容器创建
         上面我们已经将节点创建好了,现在可以在这些节点上创建容器了,那么就需要看看docker service 的帮助信息:
         
  27. dockerman教程 docker-swarm_docker_13

  28.     可以看到有create这个命令,可以这样理解,docker server create 相当于docker run 就是创建容器,只不过在swarm中是不同的表现方式。
        7.1)manager节点上创建容器服务,这里我们以nginx为例
               命令:docker service create -p 8888:80 --name my-nginx nginx
               
  29. dockerman教程 docker-swarm_Docker_14

  30.           可以查看是否创建成功:
              
  31. dockerman教程 docker-swarm_服务器_15

  32.           可以具体看这个service的内容:
             
  33. dockerman教程 docker-swarm_服务器_16

  34.     7.2)水平扩展容器服务,使用scale对容器服务的数量进行水平扩展,它可以帮助我们创建多个service
               命令:docker service scale 服务名=数量
              
  35. dockerman教程 docker-swarm_Docker_17

  36.            通过命令docker service ls查看
               
  37. dockerman教程 docker-swarm_服务器_18

  38.           再看看具体的容器数量:
              命令:docker service ps 服务命令:
              
  39. dockerman教程 docker-swarm_dockerman教程_19

  40.           我们可以通过docker ps命令在4台服务器上查看我们创建的4个服务分别运行在哪个服务器上
              
  41. dockerman教程 docker-swarm_dockerman教程_20

  42.            如上可以发现4台服务器一台机器运行了一个容器服务
        7.3)scale在swarm中除了水平扩展外,还有一个作用,那就是修复作用,比如将某一个节点中的容器删除掉,那么很快swarm中发觉并进行修复,数量保持原先的样子
            假如现在删除worker中的一个容器,我们就删除docker02中的容器:
            
  43. dockerman教程 docker-swarm_服务器_21

  44.         我们在manager节点中查看容器情况:
            
  45. dockerman教程 docker-swarm_docker_22

  46.        可以看到红色就是我们删掉的容器,但是后面它又马上补充了一个,保持了整个系统的稳定性。
    8)我们在浏览器上访问4台服务器的nginx试试
         
  47. dockerman教程 docker-swarm_dockerman教程_23


  48. dockerman教程 docker-swarm_dockerman教程_24


  49. dockerman教程 docker-swarm_Docker_25


  50. dockerman教程 docker-swarm_Docker_26

  51. 将我们部署的service移除命令:
  52. dockerman教程 docker-swarm_docker_27

  53.  
  54. dockerman教程 docker-swarm_Docker_28