30

Docker Swarm

Swarm是docker 集群模式,主要分为管理者和工作者模式。

工作模式

image-20210110044017241

集群环境中,Manager(管理者)最少为三台,而Manager下管理多台Worker(工作者)

搭建集群

准备至少四台服务器

查看swarm命令帮助

[root@VM_0_8_centos ~]# docker swarm --help

Usage: docker swarm COMMAND

Manage Swarm

Commands:
ca Display and rotate the root CA
init Initialize a swarm #初始化一个节点
join Join a swarm as a node and/or manager #加入一个节点
join-token Manage join tokens #生成manager节点
leave Leave the swarm #离开集群节点
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm

初始化节点

[root@VM_0_8_centos ~]# docker swarm init --help

Usage: docker swarm init [OPTIONS]

Initialize a swarm

Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port]) # IP地址
--autolock Enable manager autolocking (requiring an unlock
key to start a stopped manager)
--availability string Availability of the node
("active"|"pause"|"drain") (default "active")
--cert-expiry duration Validity period for node certificates
(ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic
(format: <ip|interface>)
--data-path-port uint32 Port number to use for data path traffic (1024 -
49151). If no value is set or is set to 0, the
default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h)
(default 5s)
--external-ca external-ca Specifications of one or more certificate signing
endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: <ip|interface>[:port])
(default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots
(default 10000)
--task-history-limit int Task history retention limit (default 5)

初始化节点时需要加入本机地址,以便于其他主机加入节点。地址分为两种:公网、私网

docker swarm init --advertise-addr string 127.0.0.1

初始化节点成功

image-20210110045224188

生成节点地址,其他主机直接运行一下命令,即可成功加入集群中。使用以下命令加入节点后,主机为Worker(工作者),若要变成manager(管理者)需生成新的管理节点

docker swarm join --token SWMTKN-1-2kj60xtr2zqts2rekblm9trm4s1uuh0nomvvjuevegwi27t6e0-dydelmr2tbrm4q3fwsc950d2i 127.0.0.1:2377

image-20210110045655232

加入成功,并显示为worker。

查看swarm所有集群主机

docker node ls   #下图中显示leader的为管理节点

image-20210110045825964

生成节点

manager节点
docker swarm join-token manager

worker节点
docker swarm join-token worker

生成管理者节点

image-20210110050202237

生成工作者节点

image-20210110050512979

主机添加完成后,使用docker node ls 查看所有

image-20210110050621922

两台manager,三台worker

至此,集群搭建完毕!

Raft协议

双主三从:当一个主节点挂了,其他节点无法使用。

Raft协议:保证大多数节点存活才可以用,只要>1,即集群最少大于3台

将另外一台主节点停止,另外一个主节点无法使用

  1. 另外一台主节点使用命令docker node ls 可用。(worker无法使用docker node ls)

    image-20210110052237936

  1. MANAGER STATUSleader的主节点停止,然后在Reachable主节点上面再次运行docker node ls命令时发现无法执行。

image-20210110052747774

  1. 重新启动docker服务后,leaderReachable主机状态替换

image-20210110053036570

将其中一台worker主机离开当前集群

docker swarm leave

image-20210110053338719

离开成功,再次查看集群节点时会发现其中一台worker节点状态为down,表示已不再集群节点中

image-20210110053505325

将此主机添加成主节点(管理者)

生成管理节点
docker swarm join-token manager

主节点变为三台主机

image-20210110053748782

停止其中一台主节点,其他两台主节点可正常使用。

image-20210110054021277

image-20210110054041341

实战: 弹性、扩缩容、集群!

集群:Swarm

启动服务:docker service

容器 => 服务 => 副本

启动一个环境,使用集群可随时扩缩容多个副本(多个服务),可理解为负载均衡!

docker service 帮助命令

root@iZe9n1hdljjk4fZ:~# docker service --help

Usage: docker service COMMAND

Manage services

Commands:
create Create a new service #创建一个服务(容器)
inspect Display detailed information on one or more services #查看服务详细信息
logs Fetch the logs of a service or task #查看服务日志
ls List services
ps List the tasks of one or more services #查看运行服务
rm Remove one or more services #删除服务
rollback Revert changes to a service's configuration #回滚操作
scale Scale one or multiple replicated services #创建多个副本
update Update a service #更新多个副本
--replicas uint
Run 'docker service COMMAND --help' for more information on a command.

docker servicedocker run类似

启动tomcat环境

docker service create -p 8080:80 --name mynginx nginx

表示当前运行副本为一台主机上面,且是随机分布的其他集群节点上

image-20210110062750024

image-20210110062738599

查看运行服务

docker service ps mynginx

image-20210110062838809

update 创建多个副本

docker service update --replicas 4 mynginx

部署了四个副本,并全部运行成功

image-20210110063013066

查看其他节点运行状态

image-20210110063038249

image-20210110063057598

image-20210110063109766

共四个服务运行,此时不管这三台服务器中的那个ip都可访问到此服务

回滚操作,将数字修改为1,就会只运行一个副本

docker service update --replicas 1 mynginx

image-20210110063714332

scale:创建多个副本

创建多个副本
docker service scale mynginx=5

image-20210110063822794

同理,回滚一个副本
docker service scale mynginx=1

image-20210110063850750

移除服务

docker service rm mynginx

image-20210110064039794

小结

Swarm:集群的管理和编排。docker可以初始化一个swarm集群,其他节点可以加入。(管理、工作者)

Node:docker节点,多个节点组成了集群网络。

Service:任务,可以在管理节点或者工作节点运行。核心。用户可访问

Task:容器内的命令,细节任务!

​ - 命令 -> 管理 -> API -> 调度- > 工作节点(创建Task容器维护!)

image-20210110174925513