Docker之路-容器编排SWARM

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 集群可以有多个管理节点,但只有一个管理节点可以成为 leaderleader 通过 raft 协议实现。

工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

Docker之路-容器编排SWARM

服务和task

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
  • global services 每个工作节点上运行一个任务

两种模式通过 docker service create--mode 参数指定。

来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。

Docker之路-容器编排SWARM

创建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 ...
上一篇:【故障公告】docker swarm 集群问题引发的故障


下一篇:Docker swarm 获取service的container信息