安装 Docker 版本 1.13 或更高版本。node
获取第 3 部分先决条件中所述的 Docker Compose。web
获取 Docker Machine
, Mac 的 Docker 桌面版和 Windows 的 Docker 桌面版预装了Docker Machine
,但在 Linux 系统上,您须要另外单独安装它。在 Windows 10 系统之前没有 Hyper-V
,以及 Windows 10 Home上,请使用 Docker Toolbox
。docker
阅读第 1 部分中的方向。shell
了解如何在第 2 部分中建立容器。浏览器
确保经过将friendlyhello
镜像推送到registry.来发布您建立的友好镜像。咱们在这里使用那个共享镜像。网络
确保映像用做已部署的容器。运行此命令,在信息中键入username、repo和tag:docker run -p 80:80 username/repo:tag
,而后访问http://localhost/
。session
请从第 3 部分得到 docker-compose.yml
的副本。app
在第 3 部分中,您采起了您在第 2 部分中编写的应用,并经过将其转换为服务来定义它在生产环境中应如何运行,在此过程当中将其扩展为 5 个负载。ssh
在第 4 部分中,您将此应用程序部署到一个群集,并在多台计算机上运行它。经过将多台计算机加入称为swarm的"Dockerized"群集,能够实现多容器、多计算机应用程序。tcp
swarm是运行 Docker 并加入群集的一组计算机。发生这种状况后,您继续运行您习惯的 Docker 命令,但如今这些命令由swarm manager在群集上执行。swarm中的计算机能够是物理的,也能够是虚拟的。加入swarm后,它们称为节点nodes。
Swarm managers可使用多种策略来运行容器,例如"emptiest node",这种节点用容器填充利用率最低的计算机。或"global",确保每台计算机只获得指定容器的一个实例。您指示群管理器在"Compose"文件中使用这些策略,就像您已经使用的策略同样。
Swarm managers是swarm中惟一能够执行命令或受权其余机器加入swarm做为workers的计算机。Workers只是在那里提供能力,没有权力告诉任何其余机器,它能够作什么,不能作什么。
到目前为止,您一直在本地计算机上以单主机模式使用 Docker。可是Docker也能够切换到swarm mode,这就是容许使用群的缘由。启用swarm mode可当即使当前计算机成为swarm manager。从那时起,Docker 会运行您在管理的swarm上执行的命令,而不只仅是在当前计算机上执行的命令。
一个swarm由多个节点组成,这些节点能够是物理节点,也能够是虚拟机。基本概念很简单:运行 docker swarm init
以启用swarm mode,使当前机器成为swarm manager,而后在其余机器上运行 docker swarm join
,让他们加入成群的workers。选择下面的选项卡,查看在各类上下文中如何发挥。咱们使用 VM 快速建立一个双机群集并将其转换为swarm。
您须要一个能够建立虚拟机 (VM) 的虚拟机管理程序,所以为计算机的操做系统安装 Oracle VirtualBox。
注意:若是您使用的是安装了 Hyper-V 的 Windows 系统(如 Windows 10),则无需安装 VirtualBox,而应改用 Hyper-V。请接下来查看 本地机器上的 VMS (WINDOWS 10) 部分。若是您使用的是 Docker Toolbox,则应该已经安装了 VirtualBox 做为它的一部分,所以您能够继续。
如今,使用 Docker-machine使用 VirtualBox 驱动程序建立几个 VM:
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
首先,快速建立一个虚拟交换(virtual switch),供虚拟机 (VM) 共享,以便它们能够相互链接。
如今,使用 Docker 提供的节点管理工具 docker-machine 建立 2 台虚拟机:
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2
您如今建立了两个 VM,分别名为 myvm1 和 myvm2。
使用此命令能够列出计算机并获取其 IP 地址。
注意:您须要做为管理员运行如下操做,不然您不会得到任何合理的输出(只有"UNKNOWN")。
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
第一台计算机充当manager,执行管理命令并验证workers加入swarm,第二台计算机是worker。
您可使用 docker-machine ssh
向 VM 发送命令。指示 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.
端口 2377 和 2376 始终指定2377端口(swarm管理端口)运行
docker swarm init
和docker swarm join
,或者根本不指定端口,并让它采用默认值。
docker-machine ls
返回的计算机 IP 地址包括端口 2376,即 Docker 守护进程端口。请勿使用此端口,不然可能会遇到错误。使用 SSH 时遇到问题?尝试 --native-ssh 标志 Docker Machine 能够选择容许您使用本身的系统的 SSH,若是因为某种缘由,您没法向 Swarm manager发送命令。只需在调用
ssh
命令时指定--native-ssh
标志:docker-machine --native-ssh ssh myvm1 ...
如您所见,对 docker swarm init
的响应包含一个预配置的 docker swarm join
命令,用于在要添加的任何节点上运行。复制此命令,并经过 docker-machine ssh
将其发送到 myvm2
,以便 myvm2
以worker身份加入您的新swarm:
$ docker-machine ssh myvm2 "docker swarm join \ --token <token> \ <ip>:2377" This node joined a swarm as a worker.
恭喜你,你创造了你的第一个swarm!
在manager上运行 docker node ls
以查看此swarm中的节点:
$ docker-machine ssh myvm1 "docker node ls" ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader
离开 swarm
若是要从新开始,能够从每一个节点运行
docker swarm leave
。
艰难的部分结束了。如今,您只需重复第 3 部分中用于在新swarm上部署的过程。请记住,只有像 myvm1 这样的swarm manager执行 Docker 命令;worker只是为了能力。
docker-machine
shell配置swarm manager到目前为止,您一直在 Docker machine ssh
中包装 Docker 命令,以便与 VM 通讯。另外一个选项是运行 docker-machine env <machine>
获取并运行一个命令,该命令将当前 shell 配置为与 VM 上的 Docker 守护进程。此方法对下一步效果更好,由于它容许您使用本地 docker-compose.yml
文件"远程"部署应用,而无需在任何地方复制它。
键入 docker-machine env myvm1
,而后复制粘贴并运行做为输出的最后一行提供的命令,以配置 shell 以与群管理器 myvm1
对话。
配置 shell 的命令因您是 Mac、Linux 仍是 Windows 而异,所以下面的选项卡上显示了每一个命令的示例。
运行 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
以验证 myvm1
如今是否为活动计算机,如其旁边的星号所示。
$ 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
运行 docker-machine env myvm1
以获取命令,将 shell 配置为与 myvm1
通讯。
PS C:\Users\sam\sandbox\get-started> docker-machine env myvm1 $Env:DOCKER_TLS_VERIFY = "1" $Env:DOCKER_HOST = "tcp://192.168.203.207:2376" $Env:DOCKER_CERT_PATH = "C:\Users\sam\.docker\machine\machines\myvm1" $Env:DOCKER_MACHINE_NAME = "myvm1" $Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true" # Run this command to configure your shell: # & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
运行给定命令以配置 shell 以与 myvm1 对话。
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
运行 docker-machine ls
以验证 myvm1
如今是否为活动计算机,如其旁边的星号所示。
PS C:PATH> docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 * hyperv Running tcp://192.168.203.207:2376 v17.06.2-ce myvm2 - hyperv Running tcp://192.168.200.181:2376 v17.06.2-ce
如今,您已经拥有 myvm1
,您可使用其做为swarm manager的能力,经过使用第 3 部分到 myvm1
中使用的 docker stack deploy
命令以及 docker-compose.yml
的本地副原本部署应用。此命令可能须要几秒钟才能完成,部署须要一些时间才能可用。在swarm manager上使用 docker service ps <service_name>
命令来验证全部服务是否已从新部署。
您经过 docker-machine shell
配置链接到 myvm1
,而且您仍然能够访问本地主机上的文件。请确保您与以前位于同一目录中,其中包括在第 3 部分中建立的 docker-compose.yml
文件。
与以前同样,运行如下命令在 myvm1 上部署应用。
docker stack deploy -c docker-compose.yml getstartedlab
就是这个,应用程序被部署在群集群上!
注意:若是镜像存储在专用registry而不是 Docker Hub 上,则须要使用
docker login <your-registry>
登陆,而后须要将--with-registry-auth
标志添加到上述命令。例如:docker login registry.example.com docker stack deploy --with-registry-auth -c docker-compose.yml getstartedlab
这将使用加密的 WAL 日志将登陆令牌从本地客户端传递到部署服务的swarm节点。有了此信息,节点可以登陆到registry并提取镜像。
如今,您可使用第 3 部分中使用的相同 docker 命令。只有此时请注意,服务(和关联的容器)已在 myvm1
和 myvm2
之间分发。
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE jq2g3qp8nzwx getstartedlab_web.1 gordon/get-started:part2 myvm1 Running 88wgshobzoxl getstartedlab_web.2 gordon/get-started:part2 myvm2 Running vbb1qbkb0o2z getstartedlab_web.3 gordon/get-started:part2 myvm2 Running ghii74p9budx getstartedlab_web.4 gordon/get-started:part2 myvm1 Running 0prmarhavs87 getstartedlab_web.5 gordon/get-started:part2 myvm2 Running
使用 docker-machine env 和 docker-machine ssh 链接到 VM
- 要将 shell 设置为与 myvm2 等其余计算机通话,只需在同一或不一样的 shell 中从新运行 docker-machine env,而后运行给定命令以指向 myvm2。这始终特定于当前shell。若是更改成未配置的 shell 或打开新shell,则须要从新运行命令。使用 docker-machine ls 列出计算机,查看计算机所处的状态,获取 IP 地址,并找出您链接到哪一个计算机(若是有)。要了解更多信息,请参阅 Docker 计算机入门主题。
- 或者,您能够以 docker-machine ssh ""的形式包装 Docker 命令,该命令直接登陆到 VM,但不容许您当即访问本地主机上的文件。
- 在 Mac 和 Linux 上,您可使用 docker-machine scp :* 跨计算机复制文件,但 Windows 用户须要像 Git Bash 这样的 Linux 终端模拟器才能正常工做。
本教程演示了 docker-machine ssh 和 docker-machine env,由于这些都经过 docker-机器 CLI 在全部平台上均可用。
能够从 myvm1 或 myvm2 的 IP 地址访问你的应用。
您建立的网络在它们之间共享,而且负载平衡。运行 docker-machine ls 以获取 VM 的 IP 地址,并在端口 4000 上的浏览器上访问其中任一地址,而后刷新(或只是卷曲它们)。
有五个可能的容器 IDs 所有随机循环,演示负载平衡。
两个 IP 地址工做的缘由是,swarm中的节点参与入口路由网格。这可确保部署在群内特定端口上的服务始终保留该端口,而无论实际运行容器的节点是什么。下图显示了在三节点群上在端口 8080 上发布的服务的路由网格的外观:
链接问题?
请记住,要在群中使用入口网络,须要在群节点之间打开如下端口,而后才能启用群模式:
- 端口 7946 TCP/UDP 用于容器网络发现。
- 端口 4789 UDP 的容器入口网络。
仔细检查您在 Web 服务下的端口部分的内容,并确保您在浏览器或卷中输入的 IP 地址反映了这一点。
您可使用 docker stack rm
拆解stack。例如:
docker stack rm getstartedlab
保持蜂群或删除它?
稍后,若是您想要 "docker-machine ssh myvm2 "docker swarm leave" 在worker上 docker-machine ssh myvm1 "docker swarm leave --force" 在manager上,但你须要这个swarm为第5部分,因此保持它周围如今。
您可使用给定命令取消设置当前 shell 中的 docker-machine 环境变量。
在 Mac 或 Linux 上,命令是:
eval $(docker-machine env -u)
在 Windows 上,命令是:
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u | Invoke-Expression
这将断开 shell 与 Docker 计算机建立的虚拟机的链接,并容许您继续在同一个 shell 中工做,如今使用本机 docker 命令(例如,在 Docker 桌面上用于 Mac 或 Docker 桌面(用于 Windows)。要了解更多信息,请参阅有关取消设置环境变量的"计算机"主题。
若是关闭本地主机,Docker 计算机将中止运行。您能够经过运行 docker-machine-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 部分中,您了解了swarm是什么,群中的节点如何成为manager或worker,建立了一个swarm,并在其上部署了应用程序。您看到核心 Docker 命令没有从第 3 部分更改,它们只需针对在swarm主机上运行。您还看到了 Docker 网络在运行中的强大功能,它保持了跨容器的负载平衡请求,即便这些请求在不一样的计算机上运行也是如此。最后,您学习了如何在群集上迭代和缩放应用。
下面是一些命令,您可能但愿运行这些命令来与swarm和 VM 进行一些交互:
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 Files\Docker\Docker\Resources\bin\docker-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