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。步骤:
在每个节点上打开一个TCP端口用于跟Swarm manager通信
在每个节点上安装Docker
创建和管理TLS证书以保护集群
对于有经验的管理员或者程序员来说,手动安装Docker Swarm的方法是最好的。另外也可以用docker-machine来安装。使用Docker Machine可以快速的在云供应商或者你自己的数据中心安装Docker Swarm。如果你的本地主机已经安装了虚拟机,那么你可以在本地环境中使用Docker Machine快速的构建和浏览Docker Swarm。这种方法会自动生成证书以保护你的集群。
如果是第一次使用Swarm,官方建议先使用Docker Machine。这里的Docker Machine是Docker官方提供的Docker Toolbox中的工具之一,主要适用于Mac和Windows系统。而本人这次学习是使用的Ubuntu系统和Ubuntu Server系统,所以这里我没有用此方法,想要了解此法请参照官方指南。
使用Docker Swarm的发现服务功能(Discovery services)可以动态的配置和管理容器的服务。想要了解更多关于Discovery services的信息请参照官方文档。
还有一些其他的相关信息:如Docker Swarm API和Advanced Scheduling(包含Docker Swarm strategies和Swarm filters)
安装Docker Swarm的方式
-
安装Docker Swarm有两种方式:
直接以swarm为镜像模板启动容器;
在系统中安装swarm的二进制可执行文件。
-
官网也列举出了这两种方法的优缺点:
-
以swarm镜像启动容器:
无需在系统中安装可执行的二进制文件;
用docker run命令每次都可以获取并运行最近版本的镜像;
容器是Swarm与主机环境相隔离,无需维护shell的路径和环境。
-
在系统中安装swarm:
Swarm项目的开发者在测试代码变更的过程中,无需在运行该二进制文件前进行容器化(“containerizing”)操作。
-
因此,官方的推荐的方式也是以Swarm镜像启动容器的方式,而且官方给出的指导文档也都是采用的此种方法。
构建Swarm集群
关于Swarm集群的构建,官方依然给了两种
Mac或Windows系统在虚拟机中运行Docker Swarm(Evaluate Swarm in a sandbox)
Linux系统中运行Docker Swarm(Build a Swarm cluster for production)
因为习惯了Hyper-v,如果要使用第一种方法必须要替换为Oracle VM VirtualBox(点击了解更多),这里计划是用Hyper-v创建虚拟机,然后安装Ubuntu Server系统,然后对第二种方法进行实践。这里只简单提一下第一种方法的步骤
安装Docker Toolbox(Install Docker Toolbox);
创建三个虚拟机运行Docker Engine(Create three VMs running Docker Engine);
创建一个Swarm发现服务的token(Create a Swarm discovery token);
创建Swarm的管理者和节点(Create the Swarm manager and nodes);
管理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;
-
配置环境;
这里的配置环境主要是使用私有仓库的配置和使用,请参照文章:批量上传镜像到私有仓库# 在客户端主机创建文件夹(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 # 操作对象 manager1 docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://172.30.0.161:8500 # 操作对象 node0 和 node1 docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
-
操作Swarm集群;
# 获取集群的管理者和节点的信息 # 操作对象 manager0 和 consul0 docker -H :4000 info # 在Swarm集群中运行应用 docker -H :4000 run hello-world # 查询Swarm集群的哪个节点在运行该应用 docker -H :4000 ps
-
测试Swarm集群的故障;
# 获取swarm容器的id或名称 # 操作对象 manager0 docker ps # 删除或关闭当前的主管理者 manager0 docker rm -f <id_name> # 创建或启动Swarm集群管理者 manager0 docker 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。