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) 共享,以便它们可以相互连接。
- 启动 Hyper-V 管理器
- 点击右键菜单中的 Virtual Switch Manager(虚拟交换机管理器)
- 点击类型为 External(外部) 的 Create Virtual Switch(新建虚拟交换机)
- 命名为 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>:" 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=""
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 = ""
$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. gordon/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web. gordon/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web. gordon/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web. gordon/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web. 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
docker 入门4 - 群 【翻译】的更多相关文章
- redis哨兵集群、docker入门
redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ...
- docker 入门1 - 方向 【翻译】
开始,第 1 部分:方向和设置 欢迎!我们很高兴您想学习 Docker.Docker 入门教程将教您如何: 设置 Docker 环境(当前步骤) 生成映像并将其作为一个容器运行 缩放应用以运行多个容器 ...
- 这可能是最为详细的Docker入门吐血总结
这可能是最为详细的Docker入门吐血总结 https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...
- Docker入门(六):Stacks
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- Docker入门(五):Swarms
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- Docker入门(四):服务(Services)
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- 这可能是最为详细的Docker入门总结
写在前面 毕设是关于区块链的,自然就用到了docker,感觉到了docker的强大.学习源于总结,所以找了一些资料,这篇文章原作写的不错,看了好多遍哈哈. 这可能是最为详细的Docker入门总结 市面 ...
- Docker入门教程(九)10个镜像相关的API
Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...
- Docker入门教程(八)Docker Remote API
Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...
随机推荐
- 取出easyui的datagrid的总数
var grid = $('#datagrid'); var options = grid.datagrid('getPager').data("pagination").opti ...
- adb的一些命令
adb pull <手机路径> <本机路径> 从手机中拉取信息到本地电脑上 adb push <本机路径> <手机路径> 从本地电脑推送信息到手机上
- SQL-W3Chool-高级:SQL CREATE DATABASE 语句
ylbtech-SQL-W3Chool-高级:SQL CREATE DATABASE 语句 1.返回顶部 1. CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库. ...
- Android:高通平台性能调试
1.GPU / CPU 信息打印脚本 gpu_cpu_info.bat @echo off echo "==================GPU====================== ...
- amm与tmpfs和swap
/dev/shm对Oracle 11g的影响: ORACLE 从11g版本开始,引入了一个自动内存管理(Automatic Memory Management)特性,该特性需要更多的共享内存(/dev ...
- test result
- 一百三十六:CMS系统之发布帖子后台逻辑
模型 class PostModel(db.Model): __tablename__ = 'post' id = db.Column(db.Integer, primary_key=True, au ...
- PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)
1018 Public Bike Management (30 分) There is a public bike service in Hangzhou City which provides ...
- C#的String.Format举例
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- PHP中使用CURL实现GET、POST、PUT、DELETE请求
/** * @param $url * @param $data * @param string $method * @param string $type * @return bool|string ...