Docker Swarm概述
Docker Swarm是Docker官方提供的集群工具。它可以将一些关联的Docker主机转变成一个虚拟Docker主机。因为Docker Swarm符合Docker API的标准,任何已经可以与Docker守护进程通信的工具都可以使用Swarm来透明地扩展到多个主机。支持工具包括:
Dokku
Docker Compose
Docker Machine
Jenkins
当然,Docker客户端本身也是被支持的,而Docker Swarm支持的工具还不止这些。 如同其他的Docker项目,Docker Swarm依然遵循着“swap, plug, and play”的原则。
理解Swarm集群创建
创建一个Swarm集群的第一步是从网上拉取Docker Swarm镜像。然后,你可以使用Docker配置Swarm manager和所有节点运行Docker Swarm。步骤:
1.在每个节点上打开一个TCP端口用于跟Swarm manager通信
2.在每个节点上安装Docker
3.创建和管理TLS证书以保护集群
对于有经验的管理员或者程序员来说,手动安装Docker Swarm的方法是最好的。另外也可以用docker-machine来安装。使用Docker Machine可以快速的在云供应商或者你自己的数据中心安装Docker Swarm。如果你的本地主机已经安装了虚拟机,那么你可以在本地环境中使用Docker Machine快速的构建和浏览Docker Swarm。这种方法会自动生成证书以保护你的集群。
安装Docker Swarm的方式
两种方式
直接以swarm为镜像模板启动容器;
在系统中安装swarm的二进制可执行文件。
优缺点
以swarm镜像启动容器:
无需在系统中安装可执行的二进制文件;
用docker run命令每次都可以获取并运行最近版本的镜像;
容器是Swarm与主机环境相隔离,无需维护shell的路径和环境。
在系统中安装swarm:
Swarm项目的开发者在测试代码变更的过程中,无需在运行该二进制文件前进行容器化(“containerizing”)操作。
因此,官方的推荐的方式也是以Swarm镜像启动容器的方式,而且官方给出的指导文档也都是采用的此种方法。
构建Swarm集群
关于Swarm集群的构建,官方依然给了两种
1.Mac或Windows系统在虚拟机中运行Docker Swarm(Evaluate Swarm in a sandbox)
2.Linux系统中运行Docker Swarm(Build a Swarm cluster for production)
因为习惯了Hyper-v,如果要使用第一种方法必须要替换为Oracle VM VirtualBox(点击了解更多),这里计划是用Hyper-v创建虚拟机,然后安装Ubuntu Server系统,然后对第二种方法进行实践。这里只简单提一下第一种方法的步骤:
1.安装Docker Toolbox(Install Docker Toolbox);
2.创建三个虚拟机运行Docker Engine(Create three VMs running Docker Engine);
3.创建一个Swarm发现服务的token(Create a Swarm discovery token);
4.创建Swarm的管理者和节点(Create the Swarm manager and nodes);
5.管理Swarm(Manage your Swarm);
每一步的具体操作请参考Docker的官方文档。 下面主要演示Docker Swarm在Linux系统中的使用,而官方文档中用到的是AWS(Amazon Web Services)平台,这里我们有选择性的参照官方文档继续自己的操作。本次示例中用到了5个host,那么这里就创建5个虚拟机。
在这里我的 Docker01 和 Docker02 分别对应 manager0 和 manager1; Docker04 和 Docker05 分别对应 node0 和 node1; Docker03 对应 consul0;
创建虚拟机;
安装Ubuntu 16.04/15.04 Server (64-bit)系统;
开启并配置ssh服务;
安装Docker;
配置环境; 这里的配置环境主要是使用私有仓库的配置和使用,请参照文章:批量上传镜像到私有仓库
# 在客户端主机创建文件夹(DomainName:Port例如example.com:9527)mkdir -p /etc/docker/certs.d/DomainName:Port# 先将ca.crt文件传到客户端主机# 在ca.crt的当前目录下将该证书复制到上面创建的文件夹cp ca.crt /etc/docker/certs.d/DomainName:Port/# 重启docker服务service docker restart# 接下来就可以从私有仓库拉取镜像或向其上传镜像了。
建立了一个发现服务的后端;
在这里,你需要创建一个及其简单的发现服务的后台,Swarm集群的管理者和节点通过这个后台进行身份验证,从而成为集群的一员。Swarm集群的管理者也会利用这些信息去判断哪些节点能够运行容器。为了简单起见,您要在同一主机Swarm集群的管理者主机上运行一个consul守护进程。
# 操作对象manager0和consul0# 命令docker run -d -p 8500:8500 --name=consul swarm/consul -server -bootstrap
创建Swarm集群;
在创建完成发现服务的后台之后就可以开始创建集群的管理者了。接下来会创建两个Swarm集群的管理者,第一个启动的管理者将会成为Swarm集群的主管理者(primary manager)。也有文章称其为master,但那种说法已经被废弃。第二个启动的管理者可以看作是备胎(replica),一旦主管理者挂掉,那么备胎将升级为主管理者。
# 在高可用的Swarm集群中创建主管理者# 操作对象 manager0 和 consul0# <manager0_ip> 和 <consul_ip>相同docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500# 操作对象 manager1docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://172.30.0.161:8500# 操作对象 node0 和 node1docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
操作Swarm集群;
# 获取集群的管理者和节点的信息# 操作对象 manager0 和 consul0docker -H :4000 info# 在Swarm集群中运行应用docker -H :4000 run hello-world# 查询Swarm集群的哪个节点在运行该应用docker -H :4000 ps
测试Swarm集群的故障;
# 获取swarm容器的id或名称# 操作对象 manager0docker ps# 删除或关闭当前的主管理者 manager0docker rm -f <id_name># 创建或启动Swarm集群管理者 manager0docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500# 查看该容器的日志sudo docker logs <id_name># 获取集群管理者和节点的信息docker -H :4000 info