Docker Swarm 简介

Docker Swarm 为Docker 提供容器集群服务,是 Docker 官 方对容器云生态进行支持的核心方案。

基本概念

Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。 Swarm 集群之前需要了解以下几个概念。

什么是swarm

嵌入在Docker Engine中的集群管理和编排功能是通过swarmkit构建的。 Swarmkit是一个独立的项目,它实现了Docker的编排层,并直接在Docker中使用。

一个群由多个Docker主机组成,这些主机以群模式运行并充当管理者(管理成员资格和委派)和工作者(运行群集服务)。 给定的Docker主机可以是管理员,工作者或执行这两种角色。 当您创建服务时,您可以定义其理想状态(副本数量,可用的网络和存储资源,将服务暴露给外部世界等等)。 Docker的工作是维持这个理想的状态。 例如,如果工作者节点变得不可用,Docker会在其他节点上调度该节点的任务。 任务是一个正在运行的容器,它是swarm服务的一部分,由swarm管理器管理,而不是独立的容器。

群集服务相对于独立容器的主要优势之一是可以修改服务的配置,其中包括连接的网络和卷,而无需手动重新启动服务。 Docker将更新配置,停止使用过时配置的服务任务,并创建与所需配置相匹配的新服务。

当Docker以群集模式运行时,您仍然可以在参与群集的任何Docker主机以及群集服务上运行独立容器。 独立容器和群集服务之间的一个主要区别是,只有群集管理员可以管理群集,而独立容器可以在任何守护进程上启动。 Docker守护进程可以作为管理者,工作者或两者参与群体。

特性

  • 与Docker Engine集成的集群管理
  • 分散设计:Docker Engine在部署时不需要处理节点角色之间的差异,而是在运行时处理这些特殊的东西
  • 声明式服务模式:Docker Engine使用声明性方法来让您在应用程序堆栈中定义各种服务的所需状态。
  • 伸缩服务
  • 理想状态调整
  • 多主机联网
  • 服务发现

节点(Nodes)

节点是参与群体的Docker引擎的一个实例。 您也可以将其视为Docker节点。 您可以在单台物理计算机或云服务器上运行一个或多个节点,但生产群部署通常包括分布在多台物理机和云计算机上的Docker节点。

节点分为管理( manager)节点和工作( wor ker)节点。

管理节点用于 Swarm集群的管理, docker swarm命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave可以在工作节点执行)。一个 Swarm集群可以有多个管理节点,但只有一个管理节点可以成为 leader ,leader通过raft协议实现。

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

enter description here

服务(Services)和任务(Tasks)

服务(Services)是要在管理器或工作节点上执行的任务的定义。它是群体系统的中心结构,也是群体与用户互动的主要根源。

任务(Task)包含一个Docker容器和在容器内运行的命令。它是swarm的原子调度单位。

服务有两种模式:

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

enter description here

命令

初始化 (swarm init)

使用docker swarm init来在本机初始化一个swarm集群

1
2
3
4
5
6
7
8
9
10
$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr指定 IP。

执行 docker swarm init 命令的节点自动成为管理节点。

添加节点 (swarm join)

向集群中添加一个工作节点/管理节点

格式: docker swarm join [OPTIONS] HOST:PORT

1
2
3
docker@worker1:~$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377

查看节点 (node ls)

使用 docker node ls 查看集群

新建服务 (service create)

命令格式:docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

例子:

1
$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine

--replicas 表示创建多少任务

查看服务信息 (service ls)

使用 docker service ls 来查看当前 Swarm 集群运行的服务

想要查看其中某一个服务的详细信息,可以使用 service inspect命令: docker service inspect [OPTIONS] SERVICE [SERVICE...]

查看服务中的任务详情 (service ps)

使用 docker service ps 来查看某个服务中的任务(Task)的详情 docker service ps [OPTIONS] SERVICE [SERVICE...]

查看服务日志 (service logs)

使用 docker service logs 来查看某个服务的日志

删除服务 (service rm)

使用 docker service rm 来从 Swarm 集群移除某个服务。

服务伸缩 (service scale)

使用 docker service scale调整服务中的任务数量

1
docker service scale backend=10

使用Stack部署服务

Stack是一组相互关联的服务,它们可以共享依赖关系,并且可以进行协调和缩放。 单个Stack能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能需要使用多个Stack)

正如之前使用 docker-compose.yml 来一次配置、启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。

我们使用 docker service create 一次只能部署一个服务,使用 docker-compose.yml 我们可以一次启动多个关联的服务。我们在此以 Swarm 集群中部署 WordPress 为例进行说明。

docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: "3"
services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3
db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
volumes:
db-data:
networks:
overlay:

在 Swarm 集群管理节点新建该文件,其中的 visualizer 服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。

部署服务

部署服务使用 docker stack deploy,其中 -c 参数指定 compose 文件名。

1
$ docker stack deploy -c docker-compose.yml wordpress

查看服务

1
2
3
$ docker stack ls
NAME SERVICES
wordpress 3

移除服务

1
2
3
4
5
6
7
8
要移除服务,使用 docker stack down
$ docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_overlay
Removing network wordpress_default

该命令不会移除服务所使用的 数据卷,如果你想移除数据卷请使用 docker volume rm

参考: