转载请标明出处:

https://blog.csdn.net/forezp/article/details/80186178

本文出自方志朋的博客

第四篇:Swarms

准备工作

  • 安装Docker版本1.13或更高版本。
  • 安装Docker compose。
  • 安装docker machine
  • 阅读第1 2 3部分的内容。
  • 确保你已发布并推送到注册仓库的friendlyhello镜像。
  • 确保你的镜像可以部署为一个容器。 运行这个命令,在你的信息中插入用户名,repo和标签:docker run -p 80:80 username / repo:tag,然后访问http:// localhost /。
  • 第3部分复制docker-compose.yml文件。

介绍

在第3部分中,介绍了你在第2部分中编写的应用程序,并定义了它应该如何在生产环境中运行,将其转化为服务,并在此过程中将其扩展5倍实例。

在第4部分中,将此应用程序部署到群集上,并在多台机器上运行它。 通过将多台机器连接到称为swarm的“Dockerized”群集,使多容器,多机器应用成为可能。

理解Swarm clusters

Swarm是一组运行Docker并加入到集群中的机器。加入到集群中之后,你将继续运行你习惯的Docker命令,但现在它现在在Docker Swarm的集群上执行。集群中的机器可以是物理的也可以是虚拟的。加入集群后,单个容器被称为节点。

Swarm manager可以使用多种策略来运行容器,例如“emptiest node” - 它可以使用容器填充使用率最低的机器。或者“global”,它确保每台机器只获取指定容器的一个实例。swarm managerd的这些策略需要在Compose文件中指定。

Swarm manager是群体中唯一可以执行你的命令的机器,或者授权其他机器作为worker加入到群体中。workers只是在那里提供能力,并没有权力告诉任何其他机器可以做什么和不可以做什么。

到目前为止,您已经在本地机器上以单主机模式使用Docker。但是Docker也可以切换到群集模式,这就是使用群集的原因。立即启用群模式使当前的机器成为群管理器。从此,Docker将运行您在您管理的群集上执行的命令,而不仅仅是在当前机器上执行。

设置你的集群

一个swarm是由多个节点组成,节点可以是物理或者虚拟的机器。它的基本概念足够简单:运行docker swarm init 命令能够开启swarm模式,并且使你的当前机器成为swarm manager,运行docker swarm join命令能够让其他机器加入到 swarm 中成为worker机器。选择的下面的选项卡,看看它是如何各自情况下发挥作用的。我们使用虚拟机快速创建一个双机集群,并且将其变成swarm.

创建集群

你需需要一个可以创建虚拟机(VM)的虚拟机管理程序,因此请为你的计算机的操作系统安装Oracle VirtualBox。

现在,创建两个vm使用docker-machine ,使用VirtualBox 驱动:

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

查看vm列表并获取它们的ip地址

你现在有2个vms创建,名字为myvm1和myvm2。

$ 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的角色,它可以执行管理命令并且验证worker 加入到 swarm中去,第二个是worker。

你可能发送命令到您的vms通过docker-machine ssh。指示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.

如您所见,对docker swarm init的响应包含一个预配置的docker swarm join命令,您可以在要添加的任何节点上运行该命令。 复制这个命令,并通过docker-machine ssh将它发送到myvm2,让myvm2作为一个worker加入你的新群体:

$ docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377" This node joined a swarm as a worker.

恭喜,你已经成功创建了你的第一个swarm。

运行docker node ls在manager机器上去查看swarm 中的节点:

$ docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active
rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader

发布你的应用到swarm cluster中去

最难的部分已经完结。现在你只需要重复再第三部分的过程将应用发布到你的swarm中去。请记住只有像myvm1这样的群集管理器才能执行Docker命令; worker只是用来工作的。

配置一个docker-machine命令成为swarm manager

到目前为止,你已经在Docker-machine ssh中将Docker命令包装为与虚拟机交谈。 另一种选择是运行docker-machine env 来获取并运行一个命令,该命令将当前shell配置为与VM上的Docker守护进程进行通信。 此方法对下一步更好,因为它允许您使用本地docker-compose.yml文件“远程”部署应用程序,而无需将其复制到任何位置。

键入docker-machine env myvm1,然后复制粘贴并运行作为输出最后一行提供的命令,以将shell配置为与swarm管理器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命令去校验现在这个活动的机器,如旁边的星号所示。:

$ 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中部署容器

现在你已经有了myvm1,你可以使用它的权利作为swarm manager器发布你的app通过使用第3部分中用于myvm1的相同docker stack deploy命令和docker-compose.yml的本地副本来部署您的应用程序。此命令可能需要几秒钟才能完成,部署的服务需要一段时间才能提供服务。在swarm管理器上使用docker service ps <service_name>命令验证所有服务是否已被重新部署。

你通过docker-machine shell配置连接到myvm1,并且你仍然可以访问本地主机上的文件。 确保你和之前操作在同一个目录下,其中包括你在第3部分中创建的docker-compose.yml文件。

和之前一样,运行下面的命令在mym1机器上部署应用。

docker stack deploy -c docker-compose.yml getstartedlab

正是这样,应用在swarm 集群中国部署了!

现在,你可以使用第3部分中使用的相同docker命令。只有这一次,请注意,服务(及相关容器)已在myvm1和myvm2之间分配。

$ docker stack ps getstartedlab

ID            NAME                  IMAGE                   NODE   DESIRED STATE
jq2g3qp8nzwx getstartedlab_web.1 john/get-started:part2 myvm1 Running
88wgshobzoxl getstartedlab_web.2 john/get-started:part2 myvm2 Running
vbb1qbkb0o2z getstartedlab_web.3 john/get-started:part2 myvm2 Running
ghii74p9budx getstartedlab_web.4 john/get-started:part2 myvm1 Running
0prmarhavs87 getstartedlab_web.5 john/get-started:part2 myvm2 Running

访问你的集群

你可以从myvm1或myvm2的IP地址访问你的应用程序。

你创建的网络在它们之间共享并负载平衡。 运行docker-machine ls来获取虚拟机的IP地址,并在浏览器中访问它们中的任何一个,并刷新(或者通过curl请求)。

有五个可能的容器ID全部随机轮训,来实现负载平衡。

两个IP地址工作的原因是群中的节点参与入口路由网格。 这可以确保部署在群集中某个端口的服务始终将该端口保留给自己,而不管实际运行容器的节点是什么。 以下是三节点群上端口8080上发布的名为my-web的服务的路由网格示意图:

迭代和扩展应用程序

从这里你可以完成你在第二部分和第三部分中学到的一切。

通过更改docker-compose.yml文件来扩展应用程序。

通过编辑代码更改应用程序行为,然后重新构建并推送新镜像。 (要做到这一点,请按照与之前构建应用程序和发布镜像相同的步骤进行操作。

无论哪种情况,只需简单地再次运行docker stack deploy来部署这些更改。

你可以使用你在myvm2上使用的相同docker swarm join命令将任何物理或虚拟机器加入此群集。之后只需运行Docker堆栈部署,并且你的应用可以利用新资源。

清除和重启

Stacks and swarms(堆栈和集群)

你能通过docker stack rm卸载堆栈。例如:

docker stack rm getstartedlab

取消设置docker-machine shell变量设置

你可以使用给定的命令取消当前shell中的docker-machine环境变量。在mac或者linux环境中命令如下:

 eval $(docker-machine env -u)

这将shell与docker-machine创建的虚拟机断开连接,并允许您继续在同一个shell中工作,现在使用本机docker命令(例如,在Docker for Mac或Docker for Windows上)。 要了解更多信息,请参阅关于取消设置环境变量的机器主题。

重启Docker machines

如果不关闭你的本地主机,Docker machines将会停止运行。你能通过运行docker-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部分中,你了解了群体是什么,群体中的节点如何成为manager或workwer,创建群体并在其上部署应用程序。 你看到Docker的核心命令并没有从第3部分改变,他们只需要将目标锁定在swarm master上。 你还看到了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 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的更多相关文章

  1. Docker官方文档翻译1

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80098675 本文出自方志朋的博客 本系列教程翻译于docker文档,文档地址:http ...

  2. Docker官方文档翻译之入门

    转自:http://www.cnblogs.com/vikings-blog/p/3958091.html Docker学习总结之docker入门 Understanding Docker 以下均翻译 ...

  3. docker官方文档翻译5

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80244682 本文出自方志朋的博客 堆栈(Stacks) 准备工作 安装Docker 1 ...

  4. docker官方文档翻译3

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80171723 本文出自方志朋的博客 第三部分: 服务 准备工作 安装Docker 1.1 ...

  5. Docker官方文档翻译2

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80158062 本文出自方志朋的博客 容器 准备工作 安装Docker,版本为1.13或者 ...

  6. Ubuntu安装Docker(官方文档翻译)

    翻译自Docker官方文档 https://docs.docker.com/engine/installation/linux/ubuntulinux/ 之前因为看不懂官方文档,卡在某个步骤无法完成安 ...

  7. 关于Docker官方CentOS镜像无法启动mysqld的总结

    很多童鞋反映,在Docker官方CentOS镜像中安装了Mysql server后,无法正常启动. 无法正常启动表现为两种情况: 1> 初始完数据库后,mysqld启动报错 2> syst ...

  8. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)中一些知识点

    Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Flume官方文档翻译--Flume 1.7.0 User Guide (unr ...

  9. Flume官方文档翻译——Flume 1.7.0 User Guide (unreleased version)(二)

    Flume官方文档翻译--Flume 1.7.0 User Guide (unreleased version)(一) Logging raw data(记录原始数据) Logging the raw ...

随机推荐

  1. 【ubuntu】更换下载源

    ubuntu,我们在使用apt新装软件的时候,会使用官方的网站去下载软件,但是会因为国内的转接点太多,而导致下载的速度非常慢 ,我们可以通过换成一些中间的节点来进行下载,比如阿里源,中科大源,清华源等 ...

  2. 浏览器后退->清除原页面div中填写的数据

    需求说明:页面表单用前端用div布局,提交之后跳转到另一个页面,但是考虑到客户奇怪的脑回路,可能会点击浏览器的后退按钮,不知道是个体情况还是都是一样,原本div中填写的数据还依然存在,所以需要让页面在 ...

  3. Windows进程间通信--命名管道

    1 相关概述 命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制.命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信. ...

  4. 函数进阶3 —— 生成器、yield from

    今天我们在进一步了解一下,生成器. ①: def func(): print('这是函数func') return '函数func' func() 结果是 这是函数func ②: def func1( ...

  5. Cloud

    Cloud = Data + Routing + Computing + Storage

  6. 01_Redis基础

    [Redis定义(参考了百度百科)] Redis是一个key-value存储系统.与Memchached类似,Redis支持的value类型更多,包括String.list.set.zset(有序集合 ...

  7. 尝试VS插件

    从试用vs2013开始,ide变得越来越智能,但是vs2013总是会出一些莫名其妙的问题,导致编译不成功,不能跟vs2010共享等等.于是由再次回到vs2010. 现在vs2015的update1更新 ...

  8. Shader之性能优化

    1.像素>>顶点数>>物体个数:shader中的计算应首先考虑放在script,其次vert,最后frag中 2.尽量用精度小的类型替换精度大的类型(特别是在frag中,要尽可 ...

  9. JSTL核心库

    1 out和set(重点) out <c:out value=”aaa”/> 输出aaa字符串常量 <c:out value=”${aaa}”/> 与${aaa}相同 < ...

  10. 爬虫入门之jsonPath PhantomJS与 selenium详解(六)

    1 jsonPath数据格式 pip安装: pip install jsonpath 用来解析json格式的字符串,类似于xpath (1) json对象的转换 json.loads() json.d ...