第四篇:Swarms
准备工作
- 安装Docker版本1.13或更高版本。
- 安装Docker compose。
- 安装docker machine
- 阅读第1 2 3部分的内容。
- 确保你已发布并推送到注册仓库的friendlyhello镜像。
- 确保你的镜像可以部署为一个容器。 运行这个命令,在你的信息中插入用户名,repo和标签:docker run -p 80:80 username / repo:tag,然后访问http:// localhost /。
- 第3部分复制docker-compose.yml文件。
介绍
在第3部分中,介绍了你在第2部分中编写的应用程序,并定义了它应该如何在生产环境中运行,将其转化为服务,并在此过程中将其扩展5倍实例。
在第4部分中,将此应用程序部署到群集上,并在多台机器上运行它。 通过将多台机器连接到称为swarm的“Dockerized”群集,使多容器,多机器应用成为可能。
理解Swarm clusters
Swarm是一组运行Docker并加入到集群中的机器。加入到集群中之后,你将继续运行你习惯的Docker命令,但现在它现在在Docker Swarm的集群上执行。集群中的机器可以是物理的也可以是虚拟的。加入集群后,单个容器被称为节点。
Swarm manager可以使用多种策略来运行容器,例如“emptiest node” - 它可以使用容器填充使用率最低的机器。或者“global”,它确保每台机器只获取指定容器的一个实例。swarm managerd的这些策略需要在Compose文件中指定。
Swarm manager是群体中唯一可以执行你的命令的机器,或者授权其他机器作为worker加入到群体中。workers只是在那里提供能力,并没有权力告诉任何其他机器可以做什么和不可以做什么。
到目前为止,您已经在本地机器上以单主机模式使用Docker。但是Docker也可以切换到群集模式,这就是使用群集的原因。立即启用群模式使当前的机器成为群管理器。从此,Docker将运行您在您管理的群集上执行的命令,而不仅仅是在当前机器上执行。
设置你的集群
一个swarm是由多个节点组成,节点可以是物理或者虚拟的机器。它的基本概念足够简单:运行docker swarm init 命令能够开启swarm模式,并且使你的当前机器成为swarm manager,运行docker swarm join命令能够让其他机器加入到 swarm 中成为worker机器。选择的下面的选项卡,看看它是如何各自情况下发挥作用的。我们使用虚拟机快速创建一个双机集群,并且将其变成swarm.
创建集群
你需需要一个可以创建虚拟机(VM)的虚拟机管理程序,因此请为你的计算机的操作系统安装Oracle VirtualBox。
现在,创建两个vm使用docker-machine ,使用VirtualBox 驱动:
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
查看vm列表并获取它们的ip地址
你现在有2个vms创建,名字为myvm1和myvm2。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
初始化swarm 并且添加节点
第一个机器扮演的是manager的角色,它可以执行管理命令并且验证worker 加入到 swarm中去,第二个是worker。
你可能发送命令到您的vms通过docker-machine ssh。指示myvm1成为一个拥有docker swarm init的swarm manager并输出如下:
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
Swarm initialized: current node <node ID> is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token <token> <myvm ip>:<port>To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如您所见,对docker swarm init的响应包含一个预配置的docker swarm join命令,您可以在要添加的任何节点上运行该命令。 复制这个命令,并通过docker-machine ssh将它发送到myvm2,让myvm2作为一个worker加入你的新群体:
$ docker-machine ssh myvm2 "docker swarm join
--token <token>
<ip>:2377"This node joined a swarm as a worker.
恭喜,你已经成功创建了你的第一个swarm。
运行docker node ls在manager机器上去查看swarm 中的节点:
$ docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active
rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader
发布你的应用到swarm cluster中去
最难的部分已经完结。现在你只需要重复再第三部分的过程将应用发布到你的swarm中去。请记住只有像myvm1这样的群集管理器才能执行Docker命令; worker只是用来工作的。
配置一个docker-machine命令成为swarm manager
到目前为止,你已经在Docker-machine ssh中将Docker命令包装为与虚拟机交谈。 另一种选择是运行docker-machine env 来获取并运行一个命令,该命令将当前shell配置为与VM上的Docker守护进程进行通信。 此方法对下一步更好,因为它允许您使用本地docker-compose.yml文件“远程”部署应用程序,而无需将其复制到任何位置。
键入docker-machine env myvm1,然后复制粘贴并运行作为输出最后一行提供的命令,以将shell配置为与swarm管理器myvm1对话。
配置shell的命令根据你是Mac,Linux还是Windows而有所不同,因此下面的选项卡中显示了每个命令的示例。
MAC或LINUX上的DOCKER MACHINE SHELL环境
运行docker-machine env myvm1命令去得到命令配置你的shell与myvm1交互。
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
运行给定的命令来配置你的shell与myvm1进行通信。
eval $(docker-machine env myvm1)
运行docker-machine ls命令去校验现在这个活动的机器,如旁边的星号所示。:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
在swarm manager中部署容器
现在你已经有了myvm1,你可以使用它的权利作为swarm manager器发布你的app通过使用第3部分中用于myvm1的相同docker stack deploy命令和docker-compose.yml的本地副本来部署您的应用程序。此命令可能需要几秒钟才能完成,部署的服务需要一段时间才能提供服务。在swarm管理器上使用docker service ps 命令验证所有服务是否已被重新部署。
你通过docker-machine shell配置连接到myvm1,并且你仍然可以访问本地主机上的文件。 确保你和之前操作在同一个目录下,其中包括你在第3部分中创建的docker-compose.yml文件。
和之前一样,运行下面的命令在mym1机器上部署应用。
docker stack deploy -c docker-compose.yml getstartedlab
正是这样,应用在swarm 集群中国部署了!
现在,你可以使用第3部分中使用的相同docker命令。只有这一次,请注意,服务(及相关容器)已在myvm1和myvm2之间分配。
$ docker stack ps getstartedlabID NAME IMAGE NODE DESIRED STATE
jq2g3qp8nzwx getstartedlab_web.1 john/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web.2 john/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web.3 john/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web.4 john/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web.5 john/get-started:part2 myvm2 Running
访问你的集群
你可以从myvm1或myvm2的IP地址访问你的应用程序。
你创建的网络在它们之间共享并负载平衡。 运行docker-machine ls来获取虚拟机的IP地址,并在浏览器中访问它们中的任何一个,并刷新(或者通过curl请求)。
有五个可能的容器ID全部随机轮训,来实现负载平衡。
两个IP地址工作的原因是群中的节点参与入口路由网格。 这可以确保部署在群集中某个端口的服务始终将该端口保留给自己,而不管实际运行容器的节点是什么。 以下是三节点群上端口8080上发布的名为my-web的服务的路由网格示意图:
迭代和扩展应用程序
从这里你可以完成你在第二部分和第三部分中学到的一切。
通过更改docker-compose.yml文件来扩展应用程序。
通过编辑代码更改应用程序行为,然后重新构建并推送新镜像。 (要做到这一点,请按照与之前构建应用程序和发布镜像相同的步骤进行操作。
无论哪种情况,只需简单地再次运行docker stack deploy来部署这些更改。
你可以使用你在myvm2上使用的相同docker swarm join命令将任何物理或虚拟机器加入此群集。之后只需运行Docker堆栈部署,并且你的应用可以利用新资源。
清除和重启
Stacks and swarms(堆栈和集群)
你能通过docker stack rm卸载堆栈。例如:
docker stack rm getstartedlab
取消设置docker-machine shell变量设置
你可以使用给定的命令取消当前shell中的docker-machine环境变量。在mac或者linux环境中命令如下:
eval $(docker-machine env -u)
这将shell与docker-machine创建的虚拟机断开连接,并允许您继续在同一个shell中工作,现在使用本机docker命令(例如,在Docker for Mac或Docker for Windows上)。 要了解更多信息,请参阅关于取消设置环境变量的机器主题。
重启Docker machines
如果不关闭你的本地主机,Docker machines将会停止运行。你能通过运行docker-machine ls命令来检查机器的状态。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Stopped Unknown
myvm2 - virtualbox Stopped Unknown
要重新启动已停止的计算机,请运行以下命令:
docker-machine start <machine-name>
例如:
$ docker-machine start myvm1
Starting "myvm1"...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Machine "myvm1" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.$ docker-machine start myvm2
Starting "myvm2"...
(myvm2) Check network to re-create if needed...
(myvm2) Waiting for an IP...
Machine "myvm2" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
总结
在第4部分中,你了解了群体是什么,群体中的节点如何成为manager或workwer,创建群体并在其上部署应用程序。 你看到Docker的核心命令并没有从第3部分改变,他们只需要将目标锁定在swarm master上。 你还看到了Docker网络的力量,即使它们运行在不同的机器上,也可以跨容器保持负载平衡请求。 最后,你学习了如何在集群上迭代和缩放应用程序。
以下是一些您可能想要运行的命令,以便与你的群集和虚拟机进行一点交互:
docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
docker-machine env myvm1 # View basic information about your node
docker-machine ssh myvm1 "docker node ls" # List the nodes in your swarm
docker-machine ssh myvm1 "docker node inspect <node ID>" # Inspect a node
docker-machine ssh myvm1 "docker swarm join-token -q worker" # View join token
docker-machine ssh myvm1 # Open an SSH session with the VM; type "exit" to end
docker node ls # View nodes in swarm (while logged on to manager)
docker-machine ssh myvm2 "docker swarm leave" # Make the worker leave the swarm
docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
docker-machine start myvm1 # Start a VM that is currently not running
docker-machine env myvm1 # show environment variables and command for myvm1
eval $(docker-machine env myvm1) # Mac command to connect shell to myvm1
& "C:Program FilesDockerDockerResourcesbindocker-machine.exe" env myvm1 | Invoke-Expression # Windows command to connect shell to myvm1
docker stack deploy -c <file> <app> # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
eval $(docker-machine env -u) # Disconnect shell from VMs, use native docker
docker-machine stop $(docker-machine ls -q) # Stop all running VMs
docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images