前言
提到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 && |
Macos系统
$ curl -L https://github.com/docker/machine/releases/download/v0.12.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \ |
Windows with Git BASH
$ if [[ ! -d "$HOME/bin" ]]; then mkdir -p "$HOME/bin"; fi && \ |
安装结束后,可以通过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 |
也可以打开virtualbox,看到创建的这几台虚机:
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 |
--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 |
同样的方式将vbox3加入集群作为worker。只有manager节点才有权限查看集群状态,在vbox上查看以及管理集群:
docker@vbox:~$ docker node ls |
离开集群命令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 |
目前执行任务的节点有两个,主要是两个worker。可以在任意一个节点上查看容器运行情况:
docker@vbox2:~$ docker ps |
任务的数量也是可以改变的,比如,将任务数增加到4个:
docker@vbox:~$ docker service scale ping=4 |
扩容后,会发现在manager节点上增加了两个容器,并正在执行ping
任务。加上一直在执行的其它两个节点上的任务,数量达到了4个。
总结
对于swarm集群的玩法,大概就是这些了,可以看出来,比较简单易上手。对于一些小规模的生产环境来说,使用swarm效率会很高,而且运维难度不大。当然,考虑可扩展性的话,可以选择更全面的k8s或者mesos。
个人分析,欢迎指正,若转载请注明出处!