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 ...