docker-swarm集群部署

一、swarm介绍

    Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker。

    Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

   从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

二、Docker Swarm集群中的角色:

      Swarm:作用于运行docker engine(引擎)的多个主机组成的集群。

      node:每一个docker engine都是一个node(节点),分为manager和worker。

     manager node:负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,它们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager node。

    worker node:接受并执行由manager node派发的任务,并且默认manager node也是一个work node,不过可以将它设置为manager-only node,让它只负责编排和管理工作。

    service:用来定义worker上执行的命令。

三、swarm集群部署

1.环境

节点1:node1       192.168.172.128

节点2:node2       192.168.172.131

节点3:node3       192.168.172.132

2.免密登录

[root@localhost ~]# cat /etc/hosts        ##三台机子都需要做
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.172.128 node1
192.168.172.131 node2
192.168.172.132 node3
[root@localhost ~]# ssh-keygen -t rsa     ##三台机子都需要做
[root@localhost ~]# ssh-copy-id -i 192.168.172.131
[root@localhost ~]# ssh-copy-id -i 192.168.172.132

3.开启允许的端口  

firewall-cmd --add-port={2377,7946,4789}/tcp --permanent
firewall-cmd --add-port={7946,4789}/udp --permanent
firewall-cmd --reload

4.构建一份私有仓库

(1):

[root@localhost ~]# docker pull registry:2
[root@localhost ~]# docker run -dit -p 5000:5000 --restart always -v /opt/data/registry/:/var/lib/registry --name registry registry:2

(2):

vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.172.128:5000  -H fd:// --containerd=/run/containerd/containerd.sock      

(3):

systemctl daemon-reload
systemctl restart docker

(4):

docker tag httpd:latest  192.168.172.128:5000/httpd
docker tag busybox:latest  192.168.172.128:5000/busybox

(5):

docker push 192.168.172.128:5000/httpd:latest 
docker push 192.168.172.128:5000/busybox:latest 

(6):

curl 192.168.172.128:5000/v2/_catalog

5.初始化docker swarm

docker swarm init --advertise-addr 192.168.172.128

把另外两台节点加入

[root@localhost ~]# docker swarm join --token SWMTKN-1-1i55rke1jsi0fg3fwa8ade1elfi9gy572j9rknvb5ltv0etdm3-extg6rkqfvaso1vhcped5z4kn 192.168.172.128:2377
This node joined a swarm as a worker.         #在另外两个节点上操作

查看节点有哪些:

[root@localhost ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
wl9tv3om7ubbfzupl65lovdu3 *   node1               Ready               Active              Leader              19.03.12
hv3mxu6u7l7ei2h565c52yuf2     node2               Ready               Active                                  19.03.12
35rbxdx15fmiu3v7q9xngpvpr     node3               Ready               Active                                  19.03.12

把node2加入/踢出为manager node

docker node promote  node2 (加入)
docker node demote node2   (踢出)

6、添加可视化工具

[root@localhost ~]# docker pull dockersamples/visualizer

  [root@localhost ~]# docker tag dockersamples/visualizer:latest 192.168.172.128:5000/dockersa
  [root@localhost ~]# docker push 192.168.172.128:5000/dockersamples/visualizer:latest


 docker run -dit -p 8888:8080 -e PORT=8080  -v /var/run/docker.sock:/var/run/docker.sock 192.168.172.128:5000/dockersamples/visualizer:latest

 

 创建swarm服务:

[root@localhost ~]# docker  service  create  --name  web1     192.168.172.128:5000/httpd

查看:

[root@localhost ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                               PORTS
q7nb1cpvvgqn        web1                replicated          1/1                 192.168.172.128:5000/httpd:latest   

 

服务的伸缩:
把服务增加到5个:

[root@localhost ~]# docker service  scale  web1=5

 

 

docker service scale web_server=3      ##减少到3个

 

 模拟节点故障,down掉node2,可以发现服务转移