Docker编排工具之Swarm

前言

提到docker集群,相关的关键字有Swarm,Kubernetes(k8s),Mesos等。三者都是目前常见的容器编排工具,选择哪一款使用于生产环境,由具体的需求决定。简单对比一下,swarm是docker原生的集群编排工具,上手简单,适用于一些小规模的集群;k8s功能是三者最全的,大规模的容器集群也没问题,学习成本最高;mesos相比之下,排在中间位置。本文主要介绍一下swarm的玩法,本文还将提到docker三剑客的docker-machine,我将利用其创建docker主机集群。

docker-machine创建主机

docker-machine是docker原生工具【三剑客】之一(另外:docker-compose和swarm),主要用于创建docker主机,这里的主机指的就是运行docker daemon的虚拟机。docker daemon即是运行docker的后台守护进程,运行着docker server,engine和job,server接收docker client ,并在engine中处理请求,然后创建出指定的job并运行。所以我们可以通过ssh的方式,发送请求给docker-machine,然后进行创建docker容器,运行任务等操作。

安装docker-machine

Linux系统

$ curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
chmod +x /tmp/docker-machine &&
sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

Macos系统

$ curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine

Windows with Git BASH

$ if [[ ! -d "$HOME/bin" ]]; then mkdir -p "$HOME/bin"; fi && \
curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" && \
chmod +x "$HOME/bin/docker-machine.exe"

安装结束后,可以通过docker-machine version查看docker-machine的版本。

创建docker虚机

利用docker-machine create命令创建docker虚机,这里需要指定在哪种集成环境中部署docker虚机,比如virtualbox通过--driver指定:

docker-machine create --driver virtualbox vbox

docker-machine支持的driver可以参考官网
创建成功后,可以通过docker-machine env vbox来查看虚机vbox的信息,还可以通过docker-machine ssh vbox进入vbox虚机。创建过程中如果出现类似【x509: certificate is valid for 192.168.99.100, not 192.168.99.101】错误,可通过docker-machine regenerate-certs解决。
同样的命令创建vbox2和vbox3。通过下面的命令查看创建的虚机:

liushy in ~  docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
vbox - virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce
vbox2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
vbox3 - virtualbox Running tcp://192.168.99.102:2376 v17.06.2-ce

也可以打开virtualbox,看到创建的这几台虚机:
vbox

swarm集群管理

前面我们已经创建了几台docker虚拟机,目前来讲,这几台docker主机相互之间是没有关联的。不同虚机里创建的docker容器还不能算是同一个集群。这时候,我们需要在每台虚机里启动swarm,来建立不同docker虚机内部容器之间的关联。集群中的角色分为manager和worker,manager管理和创建service,service描述了task如何执行,worker执行task创建容器并执行任务,默认情况下manager也会执行task。

swarm初始化集群

将vbox作为集群的manager,进入vbox虚机里,初始化swarm集群:

docker@vbox:~$ docker swarm init --listen-addr 192.168.99.100:2377 --advertise-addr 192.168.99.100
Swarm initialized: current node (9pvoc8y1ouu1zl4dzd0fojtl2) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-2ns4voyrkx885wzh9l2bo69bbrg70sonkcpuxi0wz5ywvzqofb-8xd74j4wxn5it3euiko5m899z 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

--listen-addr指定监听地址,即manager节点的docker服务所在的IP:PORT,--advertise-addr指定广播的地址,即其他节点加入该swarm集群时需要访问的IP。执行命令后,我们可以看到反馈的信息,分别交代了其它节点如何以worker或者manager加入集群。没必要记住生成的token,可以通过docker swarm join-token worker或者docker swarm join-token manager查看token。

节点加入集群

可以不用ssh进入虚机,直接通过docker-machine命令将节点vbox2加入集群中作为worker:

liushy in ~  docker-machine ssh vbox2 docker swarm join --token SWMTKN-1-2ns4voyrkx885wzh9l2bo69bbrg70sonkcpuxi0wz5ywvzqofb-8xd74j4wxn5it3euiko5m899z 192.168.99.100:2377
This node joined a swarm as a worker.

同样的方式将vbox3加入集群作为worker。只有manager节点才有权限查看集群状态,在vbox上查看以及管理集群:

docker@vbox:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
9pvoc8y1ouu1zl4dzd0fojtl2 * vbox Ready Active Leader
rgrof4dclul3kki4uo76k0kn6 vbox3 Ready Active
zngbo89y89gczgd7dljq9r06l vbox2 Ready Active

离开集群命令docker swarm leave

创建service

集群的service即是在节点内创建容器,并在容器内执行任务。登陆进manager节点vbox创建service:

docker@vbox:~$ docker service create --replicas 2 --name ping centos ping docker.com

--replicas指定service需要的任务数量,--name指定了service的名称,在这里使用了镜像centos,执行的任务是ping docker.com。在manager节点上查看service:

docker@vbox:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vjxa7mdk1tvm ping replicated 2/2 centos:latest

目前执行任务的节点有两个,主要是两个worker。可以在任意一个节点上查看容器运行情况:

docker@vbox2:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3222a5593e2 centos:latest "ping docker.com" 26 seconds ago Up 26 secon

任务的数量也是可以改变的,比如,将任务数增加到4个:

docker@vbox:~$ docker service scale ping=4
ping scaled to 4
docker@vbox:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vjxa7mdk1tvm ping replicated 4/4 centos:latest
docker@vbox:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4b5c3350b6b centos:latest "ping docker.com" Less than a second ago Up Less than a second ping.4.xrel6v9kp138zme0029d80c8d
468295b3bed0 centos:latest "ping docker.com" Less than a second ago Up Less than a second ping.3.zgviw21i3oz39atekofethg34

扩容后,会发现在manager节点上增加了两个容器,并正在执行ping任务。加上一直在执行的其它两个节点上的任务,数量达到了4个。

总结

对于swarm集群的玩法,大概就是这些了,可以看出来,比较简单易上手。对于一些小规模的生产环境来说,使用swarm效率会很高,而且运维难度不大。当然,考虑可扩展性的话,可以选择更全面的k8s或者mesos。

个人分析,欢迎指正,若转载请注明出处!