简介
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
原理
swarm 集群由管理节点(manager)和工作节点(work node)构成。
- swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
- work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。
功能特点
-
与Docker Engine集成的集群管理
使用Docker Engine CLI创建一组Docker引擎,您可以在其中部署应用程序服务。您不需要其他编排软件来创建或管理群集。
-
节点分散式设计
Docker Engine不是在部署时处理节点角色之间的差异,而是在运行时处理角色变化。您可以使用Docker Engine部署两种类型的节点,管理节点和工作节点。这意味着您可以从单个服务器构建整个群集。
-
声明性服务模型
Docker Engine使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,您可以描述由具有消息队列服务和数据库后端的Web前端服务组成的应用程序。
-
可扩容与缩放容器
对于每个服务,您可以声明要运行的任务数。当您向上或向下缩放时,swarm管理器通过添加或删除任务来自动适应,以保持所需的任务数量来保证集群的可靠状态
-
容器容错状态协调
群集管理器节点不断监视群集状态,并协调您表示的期望状态的实际状态之间的任何差异。例如,如果设置一个服务以运行容器的10个副本,并且托管其中两个副本的工作程序计算机崩溃,则管理器将创建两个新副本以替换崩溃的副本。 swarm管理器将新副本分配给正在运行和可用的worker节点上。
-
多主机网络
您可以为服务指定覆盖网络。当swarm管理器初始化或更新应用程序时,它会自动为覆盖网络上的容器分配地址。
-
服务发现
Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称,并负载平衡运行的容器。您可以通过嵌入在swarm中的DNS服务器查询在群中运行的每个容器。
-
负载平衡
您可以将服务的端口公开给外部负载平衡器。在内部,swarm允许您指定如何在节点之间分发服务容器。
-
缺省安全:
群中的每个节点强制执行TLS相互验证和加密,以保护其自身与所有其他节点之间的通信。您可以选择使用自签名根证书或来自自定义根CA的证书。
-
滚动更新
在已经运行期间,您可以增量地应用服务更新到节点。 swarm管理器允许您控制将服务部署到不同节点集之间的延迟。如果出现任何问题,您可以将任务回滚到服务的先前版本。
Docker安装
参考《Docker安装》
环境信息
IP | hostname | 角色 |
---|---|---|
192.168.8.7 | node1 | manager |
192.168.8.8 | node2 | worker |
192.168.8.9 | node3 | worker |
注:请按照表格信息配置hostname及hosts,并关闭SELinux
集群占用端口说明
- 2377:TCP端口2377用于集群管理通信
- 7946:TCP和UDP端口7946用于节点之间的通信
- 4789:TCP和UDP端口4789用于覆盖网络流量
注:请关闭防火墙或者开放以上端口,保证服务器之间通讯
常用命令
在Docker Swarm中经常使用的主要有docker swarm、docker node、docker service、docker stack。
docker swarm
管理swarm,添加节点
[root@node1 ~]# docker swarm
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
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
Run 'docker swarm COMMAND --help' for more information on a command.
docker node
用于管理节点
[root@node1 ~]# docker node
Usage: docker node COMMAND
Manage Swarm nodes
Commands:
demote Demote one or more nodes from manager in the swarm
inspect Display detailed information on one or more nodes
ls List nodes in the swarm
promote Promote one or more nodes to manager in the swarm
ps List tasks running on one or more nodes, defaults to current node
rm Remove one or more nodes from the swarm
update Update a node
Run 'docker node COMMAND --help' for more information on a command.
docker service
管理service
[root@node1 ~]# docker service
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
Run 'docker service COMMAND --help' for more information on a command.
docker stack
与docker-compose结合的命令,可以方便地在集群中部署应用。
[root@node1 ~]# docker stack
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
Run 'docker stack COMMAND --help' for more information on a command.
安装步骤
初始化swarm
在manager服务器执行以下命令,本文为node1
[root@node1 ~]# docker swarm init --advertise-addr 192.168.8.7
Swarm initialized: current node (7htximl90se568lzwk1et2vn9) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在worker节点执行命令加入集群
node2:
[root@node2 ~]# docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377
This node joined a swarm as a worker.
node3:
[root@node3 ~]# docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377
This node joined a swarm as a worker.
新增manager及worker
如果后续我们有新的主机被当做manager、worker节点想要加入到集群中来,但要不记得当时创建集群时的token,在manager主机上执行以下命令获取加入集群命令
**注意:manager请保证为奇数个 **
获取manager加入集群命令
[root@node1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-00118144xv1kbsk3woco3ux73 192.168.8.7:2377
获取worker加入集群命令
[root@node1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2wd1k3wtlg5lbbhxp13xt5i62cu2sn6woo4fz2pulvmhjhk7al-bny44walw7sgn541bsxu07qnm 192.168.8.7:2377
查看节点信息
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
7htximl90se568lzwk1et2vn9 * node1 Ready Active Leader 20.10.4
pd3aky1qe8pes1hk4v46vqfg1 node2 Ready Active 20.10.4
w1sjaj724jww19mpkqlbrwpf9 node3 Ready Active 20.10.4
AVAILABILITY列的说明:
- Active 意味着调度程序可以将任务分配给节点。
- Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
- Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。
MANAGER STATUS列的说明
显示节点是属于manager或者worker
- 没有值 表示不参与群管理的工作节点。
- Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
- Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
- Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
升级或降级节点
您可以将工作程序节点提升为manager角色。这在管理器节点不可用或者您希望使管理器脱机以进行维护时很有用。 类似地,您可以将管理器节点降级为worker角色。无论您升级或降级节点,您应该始终在群中维护奇数个管理器节点。升级节点或降级节点都应该在manager节点上执行命令
升级节点
[root@node1 ~]# docker node promote node2
Node node2 promoted to a manager in the swarm.
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
7htximl90se568lzwk1et2vn9 * node1 Ready Active Leader 20.10.4
pd3aky1qe8pes1hk4v46vqfg1 node2 Ready Active Reachable 20.10.4
w1sjaj724jww19mpkqlbrwpf9 node3 Ready Active 20.10.4
降级节点
[root@node1 ~]# docker node demote node2
Manager node2 demoted in the swarm.
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
7htximl90se568lzwk1et2vn9 * node1 Ready Active Leader 20.10.4
pd3aky1qe8pes1hk4v46vqfg1 node2 Ready Active 20.10.4
w1sjaj724jww19mpkqlbrwpf9 node3 Ready Active 20.10.4
创建自定义的overlay网络
manager节点执行
[root@node1 ~]# docker network create --driver overlay --subnet 10.10.10.0/16 zhouhuo
查询swarm网络
[root@node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f647038e58a7 bridge bridge local
6e9ca1596448 docker_gwbridge bridge local
ca2d5413e2b6 host host local
v9ncjd3k2jj0 ingress overlay swarm
aed5f8621657 none null local
4vtxz910km0q zhouhuo overlay swarm
测试
测试将采用创建nginx服务的方式测试,以下操作均在manager节点执行
拉取镜像
[root@node1 ~]# docker pull nginx
创建nginx service
[root@node1 ~]# docker service create --name nginx --replicas 3 --network zhouhuo --publish 80:80 nginx:latest
bq1ht621wefby8sm76dlytaxr
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
docker service create中的参数说明:
- --name 服务名
- --replicas 是创建的副本的数量
- --network 是使用的网络
- --publish 是服务公开的端口 :
查看nginx服务节点分配信息
[root@node1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
tbx69a37e5nu nginx.1 nginx:latest node2 Running Running 18 seconds ago
u9nfgm7djld4 nginx.2 nginx:latest node3 Running Running 19 seconds ago
uk7yboqag865 nginx.3 nginx:latest node1 Running Running 19 seconds ago
外部访问公开端口80
均能访问成功
评论区