Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。Swarm mode内置kv存储功能,具有容错能力的去中心化设计、内置服务发现、负载均衡等。本文主要介绍Docker Swarm Mode的相关概概念及使用步骤。
一、Swarm Mode概念
1、节点
运行 Docker 的主机可以初始化一个 Swarm 集群,或加入一个已存在的 Swarm 集群,从而成为一个 Swarm 集群的节点(node)。节点分为两种:
(1)管理节点(Manager node):用于 Swarm 集群的管理,所有的 “docker swarm” 命令基本上只能在管理节点上执行(工作节点可以执行退出集群的命令 “docker swarm leave”)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以担任 leader,leader 通过 Raft 协议实现状态同步。
(2)工作节点(Worker node):负责执行任务的节点,管理节点将服务(service)下发到工作节点进行执行。管理节点通常也是工作节点,可以选择通过配置使服务仅在管理节点上运行。
2、服务和任务
(1)任务(Task) 是 Swarm 中最小的调度单位,当前就是一个单一的容器。
(2)服务(Service) 是指一组任务的集合,服务定义了任务的属性。服务有两种运行模式:
- 复制模式(replicated services):按照设定的规则在各个工作节点上运行指定数量的任务;
- 全局模式(global services):在每个工作节点上运行一个任务。
这两种模式可以通过 “docker service create” 命令的 “–mode” 参数进行指定。
二、创建Swarm集群
接下来将创建一个包含一个管理节点和两个工作节点的最小 Swarm 集群。
1、初始化集群
在已经安装好 Docker 的主机上,执行如下命令:
$ 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” 命令的节点会自动成为管理节点。
2、增加工作节点
在上一步中我们已成功初始化一个 Swarm 集群,现在,我们将在两个 Docker 主机上分别执行如下命令,创建工作节点并将其加入到集群中:
$ docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377
成功后,将看到如下输出:
This node joined a swarm as a worker.
3、查看集群
经过上述两步,我们已拥有一个最小的 Swarm 集群,包含一个管理节点和两个工作节点。在管理节点上,使用以下命令查看集群状态:
$ docker node ls
三、部署Swarm Mode服务
为了管理 Swarm 集群中的服务,我们使用 “docker service” 命令,该命令只能在管理节点上执行。
1、新建服务
现在,我们将在之前创建的 Swarm 集群中运行一个名为 “nginx” 的服务:
$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
完成后,可以使用浏览器访问任意节点 IP,即可看到 nginx 的默认页面。
2、查看服务
使用以下命令查看当前 Swarm 集群中运行的服务:
$ docker service ls
要查看某个服务的详细信息,可以使用:
$ docker service ps nginx
查看服务的日志,可以使用:
$ docker service logs nginx
3、服务伸缩
我们可以使用 “docker service scale” 对服务运行的容器数量进行伸缩。在业务高峰期,可以扩展服务的容器数量:
$ docker service scale nginx=5
在业务平稳期,可以减少服务的容器数量:
$ docker service scale nginx=2
4、删除服务
若需从 Swarm 集群中移除某个服务,请使用以下命令:
$ docker service rm nginx
四、使用Compose文件
就像之前使用 “docker-compose.yml” 文件来一次性配置和启动多个容器一样,在 Swarm 集群中也可以使用 Compose 文件(”docker-compose.yml”)来配置和启动多个服务。在上一节中,我们只能通过 “docker service create” 一次部署一个服务,而使用 “docker-compose.yml” 文件,我们可以同时启动多个相关的服务。
为此,我们将以在 Swarm 集群中部署 WordPress 为例进行说明。在 Swarm 集群的管理节点上新建相应的 Compose 文件,其中的 “visualizer” 服务提供一个可视化页面,可以方便地查看集群中各个服务的运行状态。
在 Swarm 集群中,我们通过 “docker stack” 命令来使用 “docker-compose.yml” 文件,下面我们对该命令进行详细讲解。
1、部署服务
使用 “docker stack deploy” 命令来部署服务,其中 “-c” 参数指定 Compose 文件:
$ docker stack deploy -c docker-compose.yml wordpress
部署后,可以在浏览器中输入任一节点的 IP 地址和端口 8080,即可查看各节点的运行状态。
还可以在新的标签页输入任一节点的 IP 地址,访问 WordPress 安装界面,安装完成后,同样可以通过该 IP 地址访问 WordPress 页面。
2、查看服务
要查看当前 Swarm 集群中运行的服务,可以使用以下命令:
$ docker stack ls
3、移除服务
如果需要移除服务,可以使用 “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” 命令。
五、管理密钥
在大型动态分布式集群中,管理和分发密码、证书等敏感信息是一项非常重要的工作。传统的密钥分发方式(如将密钥放入镜像中、设置环境变量、动态挂载卷等)存在潜在的安全风险。
Docker 目前提供了 “secrets” 管理功能,用户可以在 Swarm 集群中安全地管理敏感数据,如密码和密钥证书,并允许在多个 Docker 容器实例间共享访问指定的敏感数据。
注意:“secret” 也可以在 Docker Compose 中使用。
接下来,我们将介绍如何在前面章节中创建的 Swarm 集群中管理敏感信息。我们以部署 MySQL 和 WordPress 服务为例。
1、创建Secret
可以使用以下命令创建 Secret,通过管道符将随机生成的密码输入:
$ openssl rand -base64 20 | docker secret create mysql_password - $ openssl rand -base64 20 | docker secret create mysql_root_password -
2、查看Secret
使用以下命令查看现有的 Secret:
$ docker secret ls
3、创建MySQL服务
创建服务的相关命令已在前面章节中介绍,以下是创建 MySQL 服务的命令:
$ docker network create -d overlay mysql_private $ docker service create \ --name mysql \ --replicas 1 \ --network mysql_private \ --mount type=volume,source=mydata,destination=/var/lib/mysql \ --secret source=mysql_root_password,target=mysql_root_password \ --secret source=mysql_password,target=mysql_password \ -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \ -e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \ -e MYSQL_USER="wordpress" \ -e MYSQL_DATABASE="wordpress" \ mysql:latest
如果没有在 “target” 中显式指定路径,Secret 默认会通过 “tmpfs” 文件系统挂载到容器的 “/run/secrets” 目录中。
然后,可以通过以下命令创建 WordPress 服务:
$ docker service create \ --name wordpress \ --replicas 1 \ --network mysql_private \ --publish target=30000,port=80 \ --mount type=volume,source=wpdata,destination=/var/www/html \ --secret source=mysql_password,target=wp_db_password,mode=0444 \ -e WORDPRESS_DB_USER="wordpress" \ -e WORDPRESS_DB_PASSWORD_FILE="/run/secrets/wp_db_password" \ -e WORDPRESS_DB_HOST="mysql:3306" \ -e WORDPRESS_DB_NAME="wordpress" \ wordpress:latest
4、查看服务
$ docker service ls
现在浏览器访问 IP:30000,即可开始 WordPress 的安装与使用。
通过以上方法,我们没有像以前通过设置环境变量来设置 MySQL 密码, 而是采用 docker secret 来设置密码,防范了密码泄露的风险。
六、管理配置信息
在动态的、大规模的分布式集群上,管理和分发配置文件也是很重要的工作。传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性。
在 Docker 17.06 以上版本中,Docker 新增了 docker config 子命令来管理集群中的配置信息,以后你无需将配置文件放入镜像或挂载到容器中就可实现对服务的配置。
注意:config 仅能在 Swarm 集群中使用。
这里我们以在 Swarm 集群中部署 redis 服务为例。
1、创建config
新建 redis.conf 文件
port 6380
此项配置 Redis 监听 6380 端口。使用 docker config create 命令创建 config
$ docker config create redis.conf redis.conf
2、查看config
使用 docker config ls 命令来查看 config。
$ docker config ls
3、创建redis服务
$ docker service create \ --name redis \ # --config source=redis.conf,target=/etc/redis.conf \ --config redis.conf \ -p 6379:6380 \ redis:latest \ redis-server /redis.conf
如果你没有在 target 中显式的指定路径时,默认的 redis.conf 以 tmpfs 文件系统挂载到容器的 /config.conf。经过测试,redis 可以正常使用。
以前我们通过监听主机目录来配置 Redis,就需要在集群的每个节点放置该文件,如果采用 docker config 来管理服务的配置信息,我们只需在集群中的管理节点创建 config,当部署服务时,集群会自动的将配置文件分发到运行服务的各个节点中,大大降低了配置信息的管理和分发难度。
七、滚动升级
在部署服务中我们使用 nginx:1.13.7-alpine 镜像部署了一个名为 nginx 的服务。现在我们想要将 NGINX 版本升级到 1.13.12,那么在 Swarm mode 中如何升级服务呢?你可能会想到,先停止原来的服务,再使用新镜像部署一个服务,不就完成服务的 “升级” 了吗。这样做的弊端很明显,如果新部署的服务出现问题,原来的服务删除之后,很难恢复,那么在 Swarm mode 中到底该如何对服务进行滚动升级呢?答案就是使用 docker service update 命令。
$ docker service update \ --image nginx:1.13.12-alpine \ nginx
以上命令使用 –image 选项更新了服务的镜像。当然我们也可以使用 docker service update 更新任意的配置。
- –secret-add 选项可以增加一个密钥;
- –secret-rm 选项可以删除一个密钥。
更多选项可以通过 docker service update -h 命令查看。
服务回退
现在假设我们发现 nginx 服务的镜像升级到 nginx:1.13.12-alpine 出现了一些问题,我们可以使用命令一键回退。
$ docker service rollback nginx
现在使用 docker service ps 命令查看 nginx 服务详情。
$ docker service ps nginx
结果的输出详细记录了服务的部署、滚动升级、回退的过程。
-
广告合作
-
QQ群号:707632017