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 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

img

服务和task

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

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

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

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

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

img

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

posted @ 2019-10-17 13:47  梧桐花落  阅读(1578)  评论(0编辑  收藏  举报