swarm mode 介绍
Docker Swarm 是 Docker 官方容器编排项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。
使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。
在Docker 1.12.0
之后的版本中,已经将swarm内嵌入docker引擎了,变成了docker的子命令docker swarm
。
swarm mode
内置了KV存储功能, 提供了众多的新特性,具有容错能力的去中心化设计,内置服务发现、负载均衡、路由网络、动态伸缩、滚动更新、安全传输等。
swarm的基本概念
Swarm
是使用 SwarmKit
构建的 Docker 引擎内置(原生)的集群管理和编排工具。
使用 Swarm
集群之前需要了解以下几个概念。
节点
运行 Docker 的主机可以主动初始化一个 Swarm
集群或者加入一个已存在的 Swarm
集群,这样这个运行 Docker 的主机就成为一个 Swarm
集群的节点 (node
) 。
节点分为管理 (manager
) 节点和工作 (worker
) 节点。
管理节点用于 Swarm
集群的管理,docker swarm
命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave
可以在工作节点执行)。一个 Swarm
集群可以有多个管理节点,但只有一个管理节点可以成为 leader
,leader
通过 raft
协议实现。
工作节点是任务执行节点,管理节点将服务 (service
) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。
服务和task
任务 (Task
)是 Swarm
中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services
) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
-
replicated services
按照一定规则在各个工作节点上运行指定个数的任务。 -
global services
每个工作节点上运行一个任务
两种模式通过 docker service create
的 --mode
参数指定。
来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。
创建swarm集群
通过前面的简单介绍,我们知道swarm是由管理节点和工作节点组成的,即leader和follower组成,我们选选取一台主机作为swarm的管理节点,在管理节点上执行命令将自己初始化为管理节点(前提是,该主机必须安装了docker环境),等待其他节点的加入:
[root@node1 ~]# docker swarm init
Swarm initialized: current node (z450zeu3ul9pcggml756lip0w) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
从init之后,给出了如何加入的方法。直接在其他节点上执行即可将主机添加到swarm集群中:
[root@node2 ~]# docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
This node joined a swarm as a worker.
可以在管理节点查看整个集群的节点信息:
[root@node1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
tuiqjpehjq9sthd77npydr8qv node2 Ready Active 19.03.2
z450zeu3ul9pcggml756lip0w * node1 Ready Active Leader 19.03.2
在swarm上部署服务
我们使用 docker service
命令来管理 Swarm
集群中的服务,该命令只能在管理节点运行。我们使用 docker service
命令来管理 Swarm
集群中的服务,该命令只能在管理节点运行。
我们在swarm上创建一个nginx服务:
[root@node1 ~]# docker service create --replicas 2 -p 8080:80 --name webnginx nginx
01zq6lp7oyxdgbvw7l34n6j9u
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
使用 docker service ls
来查看当前 Swarm
集群运行的服务。
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
01zq6lp7oyxd webnginx replicated 2/2 nginx:latest *:8080->80/tcp
我们分别在管理节点和从节点访问下8080
端口,然后可以看看日志:
[root@node1 ~]# docker service logs webnginx
webnginx.1.rf2e15kitl28@node1 | 10.255.0.3 - - [17/Oct/2019:05:27:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
webnginx.2.35miixmebucu@node2 | 10.255.0.2 - - [17/Oct/2019:05:26:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
swars进行服务伸缩
我们可以使用 docker service scale
对一个服务运行的容器数量进行伸缩。
当业务处于高峰期时,我们需要扩展服务运行的容器数量。
[root@node1 ~]# docker service scale webnginx=5
webnginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
01zq6lp7oyxd webnginx replicated 5/5 nginx:latest *:8080->80/tcp
从上面可以看到副本数量变成了5个。
当业务平稳时,我们需要减少服务运行的容器数量。
[root@node1 ~]# docker service scale webnginx=1
webnginx scaled to 1
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
01zq6lp7oyxd webnginx replicated 1/1 nginx:latest *:8080->80/tcp
删除swarm启动的服务,发现容器也销毁了:
[root@node1 ~]# docker service rm webnginx
webnginx
[root@node1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
[root@node1 ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
总结
# 集群管理
docker swarm init
docker swarm join --token <token>
# 节点管理
docker node [options]
# 服务管理
docker service create ...
docker service ls
docker service logs ...
docker service rm ...