1、简介

在已安装docker的基础上
如果swarm集群中只有一个管理节点,该管理节点如果宕机或者离开集群环境,那么该集群就不存在了。所以在一个具有N个管理节点的集群环境中,一定有管理节点总数的50%以上的节点来处理请求和保持可用。
Swarm中的管理节点都是通过实现Raft一致性算法来管理所有节点的状态。通过实现Raft Consensus Algorithm,可以确保集群中的所有任务、存储等都是一致的状态
通常情况下,一个Raft 集群包括了若干个服务器。在给定的任意时间点上,每个服务器都处在以下三种状态的一种:指挥者、跟随者,或候选者。在一般操作中,一定会有一个指挥者,剩下的服务器都是跟随者。跟随者是被动的:它们自己不提交任何需求,仅仅响应指挥者和候选者提出的需求。指挥者处理所有的客户端需求(如果客户端向跟随者发送了需求,跟随者会把它转交给指挥者)。至于第三种状态——候选者——则是用来选举一个新的指挥者。Raft 用一种心跳机制来触发指挥者选举。当服务器启动时,它们先从跟随者做起,并会在接收到指挥者或候选者发送的有效RPC 协议(远程过程调用协议)之前,一直执行跟随者的工作。指挥者定时向全体跟随者发送心跳信息,以保持它们的授权。如果一个跟随者超过一定时间没有接收到心跳信息(这段时间称为“选举超时”),它就会假设指挥者已经失效,然后启动选举,来选择一个新的指挥者。

2、配置

1.初始化集群
sudo docker swarm init --advertise-addr 192.168.56.102

2.创建集群网络
sudo docker network create -d overlay --subnet=10.0.10.0/24 --attachable well

3.节点加入集群
docker swarm join --token SWMTKN-1-0tixq1sc9nzs02hrinrl5710qs14b6qfz1ey2be92i6l1xde72-c7kogarn0vmobiih7f6le7fjk 192.168.56.102:2377

4.删除集群
sudo docker swarm leave --force

5.提升节点为备用管理节点(备用节点需要超过总节点半数HA生效)
sudo docker node promote docker

6.创建服务
6.1.通过标签限制节点运行
sudo docker node update --label-add env=proxy mece1
sudo docker node update --label-add env=proxy mece2
sudo docker service create --name zhao2 --hostname zhao2 -p 9000:5000 --network well --replicas 20 --constraint 'node.labels.env!=proxy' registry

6.2.通过hostname限制节点运行
sudo docker service create --name registry --hostname registry -p 5000:5000 --network zhao --replicas 4 --constraint 'node.hostname!=mece1' --constraint 'node.hostname!=mece2' registry

6.3.通过label运行
sudo vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock --insecure-registry 192.168.209.0/24 --label hostname=master
sudo systemctl daemon-reload
sudo systemctl restart docker
docker service create --name web --replicas 4 --constraint engine.labels.hostname==master nginx

7.更新服务
sudo docker service update --replicas 5 --image registry registry

8.服务示例
8.1.nginx服务
docker run -d --name nginx-proxy1 --hostname nginx-proxy1 --network test --restart=always -p 80:80 -p 443:443 -v /data/conf/nginx.conf:/etc/nginx.conf -v /data/ssl:/ssl registry.test.com/nginx:1.12.2

8.2.registry服务
docker run -d --name registry --hostname registry --network test --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry registry.test.com/registry:2.0

8.3.portainer服务(IE访问)
docker run -d --name portainer --hostname portainer --network test --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock registry.test.com/portainer:2.0

8.4.zookeeper服务
docker run -d --name zk1.test.com --hostname zk1.test.com --network test --restart=always -e SERVER_ID=1 -e ADDITIONAL_ZOOKEEPER_1=server.1=zk1.test.com:2888:3888 -e ADDITIONAL_ZOOKEEPER_2=server.2=zk2.test.com:2888:3888 -e ADDITIONAL_ZOOKEEPER_3=server.3=zk3.test.com:2888:3888 registry.test.com/zookeeper:3.4.11

8.5.dubbo服务
docker service create --name settlementweb-jar --hostname settlementweb-jar --network test registry.test.com/jdk:1.8u162

8.6.tomcat服务
docker service create --name merchantpcweb-war --hostname merchantpcweb-war --network test registry.test.com/tomcat:9.0.6

8.7.redis服务
docker run -d --name redis1.test.com --hostname redis1.test.com --network test -v /data/redis:/data/redis/data --restart=always --ip 10.0.9.210 registry.test.com/redis:3.0.6

9.helathcheck使用
docker run --rm -d \
--name=elasticsearch \
--health-cmd="curl --silent --fail localhost:9200/_cluster/health || exit 1" \
--health-interval=5s \
--health-retries=12 \
--health-timeout=2s \
elasticsearch:5.5
备注:
--interval=<间隔>:两次健康检查的间隔,默认为30秒
--timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认30秒
--retries=<次数>:当连续失败指定次数后,则将容器状态视为unhealthy,默认3次
--start-period=<间隔>: 应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认0秒; (从17.05)引入