Swarms的使用

先决条件

  • 安装Docker 1.13或更高版本。
  • 阅读完Docker基础简介
  • 阅读完容器简介
  • 确保已按照指示将您创建的容器推送到远程仓库, 我们将在这里使用它。
  • 通过运行以下操作并访问http://localhost/确保您的镜像正常工作:
    docker run -p 80:80 username/repo:tag
  • 从上一章复制一份docker-compose.yml

介绍

在上一章中,您使用了容器简介中写过的应用程序,并将其转换为服务,并将其扩展为5倍的规模在生产环境中运行。

在这一章,我们将学习将此应用程序部署到集群上,并在多台机器上运行。实现将多台机器连接在一起组成一个Docker化的多容器,多机器的应用程序叫做Swarms。

理解群集

Swarm是正在运行Docker并已加入群集的一组计算机。您可以继续运行您以前使用的Docker命令,但现在它们由Swarm管理器在集群上执行。Swarm中的机器可以是物理机或虚拟机。加入Swarm后,这些机器被称为节点。

Swarm管理员可以使用多种策略来运行容器,例如“emptiest node” - 这让机器开启最少的容器,或“global”-它确保每台机器只能获得指定容器的一个实例。您可以指示Swarm管理员在撰写Compose文件中使用这些策略,就像您已经在前面使用过的策略一样。

Swarm管理器是Swarm中唯一可以执行命令的机器,或授权其他机器作为工作机加入Swarm。工作机只是提供能力,没有权力告诉任何其他机器可以做什么和不能做什么。

到目前为止,您已经在本地计算机上以单主机模式使用Docker。但是Docker也可以切换到Swarm模式,这就是使用Swarms。立即启用Swarm模式使当前的机器成为Swarm管理器。之后,Docker将在您正在管理的Swarm上执行的命令,而不仅仅是在当前的机器上运行。

设置你的群

一个Swarm由多个节点组成,可以是物理机或虚拟机。使用起来很简单:运行docker swarm init启用群组模式,使您当前的机器成为一个Swarm管理器,然后在其他机器上运行docker swarm join ,让他们以工作机身份加入该Swarm。我们将使用虚拟机快速创建双机群集并将其转换成Swarm。

创建一个集群

本地虚拟机(Mac,Linux,Windows 7和8)

首先,您需要一个可以创建虚拟机的管理程序,因此可以为您的机器的操作系统安装VirtualBox。

注意:如果您安装的是具有Hyper-V的Windows系统,例如Windows 10,则不需要安装VirtualBox,您应该使用Hyper-V。

现在,docker-machine使用VirtualBox驱动程序创建几个虚拟机:

$ docker-machine create --driver virtualbox myvm1
$ docker-machine create --driver virtualbox myvm2

您现在有两个虚拟机,命名myvm1myvm2。第一个将作为管理员,执行docker命令并认证工作机加入,第二个将是一个工作机。

您可以使用docker-machine ssh发送命令到您的虚拟机。使用docker swarm init指示myvm1 成为一个Swarm管理员,你会看到这样的输出:

$ docker-machine ssh myvm1 "docker swarm init"
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> \
  <ip>:<port>

返回错误信息?
通过命令docker-machine ls查看myvm1ip的地址,复制myvm1运行的IP地址,然后再次运行该 命令docker swarm init,使用该IP并指定端口2377 (--advertise-addr)。例如:

docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"

您可以看到,执行docker swarm init之后的响应中有一条docker swarm join命令,您可以在要添加的任何节点上运行该命令。复制此命令,并通过docker-machine ssh将其发送到myvm2myvm2 以工作机加入您的Swarm:

$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:<port>"

This node joined a swarm as a worker.

恭喜,你已经创建了你的第一个群。

注意:您也可以运行docker-machine ssh myvm2,不附加其他命令来打开该VM上的终端会话。以这种方式粘贴join命令可能会更容易。

在集群上部署应用程序

困难的部分已经结束了。现在您只需重复服务中使用的命令,即可将容器部署在新的Swarm中。记住,只有Swarm管理员myvm1需要执行Docker命令,工作机只提供计算资源。

使用docker-machine scp命令将服务中创建的文件docker-compose.yml复制到Swarm管理员 myvm1的主目录(别名:~):

docker-machine scp docker-compose.yml myvm1:~

现在myvm1以管理员的身份,通过docker-machine ssh发送你在服务中使用过的docker stack deploy命令来部署您的应用程序:

docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

这时应用程序就已经部署在集群上了。

将您在服务中使用的所有命令通过docker-machine ssh调用,它们将按照您的期望工作。这个时候,你会看到容器已经分布在myvm1myvm2上。

$ docker-machine ssh myvm1 "docker stack ps getstartedlab"

ID            NAME        IMAGE              NODE   DESIRED STATE
jq2g3qp8nzwx  test_web.1  username/repo:tag  myvm1  Running
88wgshobzoxl  test_web.2  username/repo:tag  myvm2  Running
vbb1qbkb0o2z  test_web.3  username/repo:tag  myvm2  Running
ghii74p9budx  test_web.4  username/repo:tag  myvm1  Running
0prmarhavs87  test_web.5  username/repo:tag  myvm2  Running

访问您的群集

你可以从IP地址来访问你的应用程序myvm1myvm2。您创建的网络在它们之间共享,并且负载平衡正常工作。运行 docker-machine ls以获取您的虚拟机的IP地址,并在浏览器上访问它们,然后点击刷新(或仅仅curl它们)。您会看到五个可能的容器ID,它们都随机循环,说明负载平衡正常工作。

两个IP地址都能正常工作的原因是群集中的节点都在同一个入口路由网格中。无论实际运行的是哪个节点,都可以确保在群集中某个端口部署的服务始终将该端口保留给其自身。以下一个发布在8080端口上叫做my-web的服务的路由网格图:

注意:如果您遇到任何连接故障,请注意,为了在Swarm中使用入口网络,您需要在启用Swarm模式之前,在Swarm节点之间打开以下端口:
7946端口用于TCP / UDP。
4789端口用于UDP。

迭代和缩放您的应用程序

从这里,您可以使用服务一章中了解的所有知识:通过更改docker-compose.yml文件来缩放应用程序,或者更改应用程序的行为。您只需运行docker stack deploy命令即可部署这些更改。你可以通过docker stack rm终止堆栈。您还可以使用docker swarm join将任何物理或虚拟机加入到此Swarm,然后运行docker stack deploy,您的应用程序就能够利用新加入的资源了。

其他

在本章,您了解了Swarm,知道了Swarm中的节点如何可以成为管理员或工作机,创建了Swarm,并在其上部署了一个应用程序。你看到Docker的核心命令并没有发生改变,他们只需要在Swarm主机上运行。您还看到了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-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 start myvm1            # Start a VM that is currently not running
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
docker-machine scp docker-compose.yml myvm1:~     # Copy file to node's home dir
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   # Deploy an app

-- END

Docker基础 2017-05-11
部署程序 2017-05-13
Docker容器 2017-05-11
服务简介 2017-05-12
Docker Stack 2017-05-12

暂无评论~~