Docker三剑客之Swarm

Docker Swarm 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。

使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Swarm 简介

Docker Swarm 是 Docker 公司推出的官方容器集群平台,基于 Go 语言实现,代码开源在 https://github.com/docker/swarm 。目前,包括 Rackspace 等平台都采用了 Swarm,用户也很容易在 AWS 等公有云平台使用 Swarm。

作为容器集群管理器,Swarm 最大的优势之一就是 100% 支持标准的 Docker API。各种基于标准 API 的工具比如 Compose、docker-py、各种管理软件,甚至 Docker 本身等都可以很容易的与 Swarm 进行集成。这大大方便了用户将原先基于单节点的系统移植到 Swarm 上。同时 Swarm 内置了对 Docker 网络插件的支持,用户可以很容易地部署跨主机的容器集群服务。

安装 Swarm

Swarm 安装有几种方式,可以基于 Docker Machine 来进行安装,也可以手动配置。为了能更容易理解 Swarm 的组件和更灵活的进行管理,推荐使用手动配置方式。

对于 Docker 1.12+ 版本,Swarm 相关命令已经原生嵌入到了 Docker engine 的支持,对于较低版本的 Docker,需要额外进行配置。

下载镜像

Docker 官方已经提供了 Swarm 镜像使用,需要在所有被 Swarm 管理的 Docker 主机上下载该镜像。

1
docker pull swarm

可以使用下面的命令来查看 Swarm 版本,验证是否成功下载 Swarm 镜像。

1
docker run --rm swarm -v

配置节点

Docker 主机在加入 Swarm 集群前,需要进行一些简单配置,添加 Docker daemon 的网络监听。

例如,在启动 Docker daemon 的时候通过 -H 参数:

1
sudo docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

目地就是配置集群调度与通讯的端口

启动集群

Docker 集群管理需要使用服务发现(Service Discover)功能,Swarm 支持以下的几种方式:DockerHub、本地文件、etcd、consul、zookeeper 和手动指定节点 IP 地址信息等。

启动 Consul 服务后端

启动 consul 服务容器,映射到主机的 8500 端口。

1
docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap

获取到本地主机的地址作为 consul 的服务地址:<consul_ip>:8500。

启动管理节点

首先,启动一个主管理节点,映射到主机的 4000 端口,并获取所在主机地址为 <manager0_ip>。其中 4000 端口是 Swarm 管理器的默认监听端口,用户也可以指定映射为其它端口。

1
docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500

启动工作节点

需要在每个工作节点上启动 agent 服务。

获取节点的主机地址为 <node_ip>,并指定前面获取到的 consul 服务地址。

1
docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500

节点启动后,用户可以指定 Docker 服务地址为 <manager0_ip>:4000> 来测试各种 Docker 命令,可以看到整个 Swarm 集群就像一个虚拟的 Docker 主机一样正常工作。

由于 Swarm 实际上是通过 agent 调用了本地的 Docker daemon 来运行容器,当 Swarm 集群服务出现故障时,无法接受新的请求,但已经运行起来的容器将不会受到影响。

使用 Swarm

前面演示了基于 consul 服务发现后端来配置一个本地 Swarm 集群。其中,consul 也可以被替换为 etcd、zookeeper 等。

另外一个更方便的方式是直接使用 DockerHub 提供的免费服务发现后端。

创建集群 id

在任意一台安装了 Swarm 的机器上执行 swarm create 命令来在 DockerHub 服务上进行注册。

Swarm 会通过服务发现后端(此处为 DockerHub 提供)来获取一个唯一的由数字和字母组成的 token,用来标识要管理的集群。

1
docker run --rm swarm create

配置集群节点

在所有要加入集群的普通节点上面执行 swarm join 命令,表示把这台机器加入指定集群当中。

例如某台机器 IP 地址为 192.168.0.2,将其加入我们刚创建的 946d65606f7c2f49766e4dddac5b4365 集群,则可以通过:

1
2
docker run --rm swarm join --addr=192.168.0.2:2375 token://946d65606f7c2f49766e4dddac5b4365
time="2015-12-09T08:59:43Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.2:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365"

配置管理节点

配置管理节点需要通过 swarm manage 命令,该命令将启动 manager 服务,默认监听到 2375 端口,所有对集群的管理可以通过该服务接口进行。

读者可能注意到,manager 服务默认监听的端口跟 Docker 服务监听端口是一样的,这是为了兼容其它基于 Docker 的服务,可以无缝地切换到 Swarm 平台上来。

可以通过 docker ps 命令来查看启动的 swarm manager 服务容器。

查看集群节点列表

集群启动成功以后,用户可以在任何一台节点上使用 swarm list 命令查看集群中的节点列表。例如

1
docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365

更多