docker 入门4 - 群 【翻译】

开始,第 4 部分:群

先决条件

  • 安装 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 Toolboxdocker

  • 阅读第 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群集

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

一个swarm由多个节点组成,这些节点能够是物理节点,也能够是虚拟机。基本概念很简单:运行 docker swarm init 以启用swarm mode,使当前机器成为swarm manager,而后在其余机器上运行 docker swarm join ,让他们加入成群的workers。选择下面的选项卡,查看在各类上下文中如何发挥。咱们使用 VM 快速建立一个双机群集并将其转换为swarm。

建立一个群集

本地机器上的 VMS(MAC、LINUX、WINDOWS 7 和 8)

您须要一个能够建立虚拟机 (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

 

本地机器上的 VMS (WINDOWS 10)

首先,快速建立一个虚拟交换(virtual switch),供虚拟机 (VM) 共享,以便它们能够相互链接。

  1. 启动 Hyper-V 管理器
  2. 点击右键菜单中的 Virtual Switch Manager(虚拟交换机管理器)
  3. 点击类型为 External(外部) 的 Create Virtual Switch(新建虚拟交换机)
  4. 命名为 myswitch,选中复选框以共享主机的活动网络适配器。

如今,使用 Docker 提供的节点管理工具 docker-machine 建立 2 台虚拟机:

 
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2

 

列出 VMS 并获取其 IP 地址

您如今建立了两个 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

 

初始化 swarm 并添加节点

第一台计算机充当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

在swarm集群 manager上部署应用

艰难的部分结束了。如今,您只需重复第 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 而异,所以下面的选项卡上显示了每一个命令的示例。

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 以验证 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

 

WINDOWS上的 DOCKER MACHINE SHELL环境

运行 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

 

在swarm manager上部署应用

如今,您已经拥有 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 地址反映了这一点。

清理和从新启动

Stacks 和 swarms

您可使用 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部分,因此保持它周围如今。

取消 docker-machine shell变量设置

您可使用给定命令取消设置当前 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 machines

若是关闭本地主机,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
 
相关文章
相关标签/搜索