docker 入门4 - 群 【翻译】

开始,第 4 部分:群

先决条件

  • 安装 Docker 版本 1.13 或更高版本。

  • 获取第 3 部分先决条件中所述的 Docker Compose。

  • 获取 Docker Machine, Mac 的 Docker 桌面版和 Windows 的 Docker 桌面版预装了Docker Machine,但在 Linux 系统上,您需要另外单独安装它。在 Windows 10 系统以前没有 Hyper-V,以及 Windows 10 Home上,请使用 Docker Toolbox

  • 阅读第 1 部分中的方向。

  • 了解如何在第 2 部分中创建容器。

  • 确保通过将friendlyhello镜像推送到registry.来发布您创建的友好镜像。我们在这里使用那个共享镜像。

  • 确保映像用作已部署的容器。运行此命令,在信息中键入username、repo和tag:docker run -p 80:80 username/repo:tag,然后访问http://localhost/

  • 请从第 3 部分获得 docker-compose.yml 的副本。

介绍

在第 3 部分中,您采取了您在第 2 部分中编写的应用,并通过将其转换为服务来定义它在生产环境中应如何运行,在此过程中将其扩展为 5 个负载。

在第 4 部分中,您将此应用程序部署到一个群集,并在多台计算机上运行它。通过将多台计算机加入称为swarm的"Dockerized"群集,可以实现多容器、多计算机应用程序。

了解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

 

 
posted @ 2019-07-25 17:14  十三燕  阅读(275)  评论(0编辑  收藏  举报