docker从零开始(四)集群初体验,docker-machine swarm
介绍
在第三节中,选择了第二节中编写的应用程序,并通过将其转换为服务来定义它应如何在生产中运行,并生成五个应用实例
在本节中,将此应用程序部署到群集上,在多台计算机上运行它。多容器,多机应用程序通过连接多台机器到称为一个“Dockerized” 容器的集群。
了解Swarm集群
swarm集群是指运行了。在此之后,您继续运行您习惯使用的Docker命令,但现在它们由群集管理器在群集上执行。群中的机器可以是物理的或虚拟的。加入群组后,它们被称为节点。
Swarm管理器可以使用多种策略来运行容器,例如“emptiest node” - 优先使用cpu利用率最低的容器。或“global”,它确保每台机器只获得指定容器的一个实例。swarm管理器根据compose配置文件中定义策略来执行。
群集管理器是群中唯一可以执行命令的机器,或授权其他机器作为工作者加入群集。工作者只是在那里提供工作能力,并且没有权力告诉任何其他机器它能做什么和不能做什么。
到目前为止,您一直在本地计算机上以单主机模式使用Docker。但是Docker也可以切换到swarm模式,这就是使用群集的能力。
立即启用群集模式使当前计算机成为群集管理器。从那时起,Docker就会运行您在swarm manager上执行的命令,而不仅仅是在当前机器上。
设置你的群
群由多个节点组成,可以是物理或虚拟机。基本概念很简单:运行docker swarm init
以启用swarm模式并使当前计算机成为群集管理器,然后docker swarm join
在其他计算机上运行 以使它们作为工作者加入群组。
在创建集群前需要熟悉 和安装 docker machine
什么是Docker Machine?
Docker Machine是一个工具,可让您在虚拟主机上安装Docker Engine,并使用docker-machine
命令管理主机。您可以使用Machine在本地Mac或Windows机器上,公司网络上,数据中心或Azure,AWS或Digital Ocean等云提供商上创建Docker主机。
使用docker-machine
命令,您可以启动,检查,停止和重新启动托管主机,升级Docker客户端和守护程序,并配置Docker客户端以与主机通信。
将Machine CLI指向正在运行的托管主机,您可以 直接在该主机上运行docker命令。例如,运行docker-machine env default
以指向被调用的主机default
,按照屏幕上的说明完成 env
设置,然后运行docker ps
,docker run hello-world
等等。
我为什么要用它?
Docker Machine使您可以在各种Linux上配置多个远程Docker主机。
我想在远程系统上配置Docker主机
Docker Engine在Linux系统上本机运行。如果你有一个Linux机器人作为主系统,并且想要运行docker
命令,那么你需要做的就是下载并安装Docker Engine。但是,如果您想要一种有效的方式在网络,云端甚至本地配置多个Docker主机,您需要Docker Machine。
无论您的主系统是Mac,Windows还是Linux,您都可以在其上安装Docker Machine并使用docker-machine
命令来配置和管理大量Docker主机。它会自动创建主机,在其上安装Docker Engine,然后配置docker
客户端。每个托管主机(“ 机器 ”)是Docker主机和已配置客户端的组合。
Docker Engine和Docker Machine有什么区别?
当人们说“Docker”时,他们通常指的是Docker Engine,由Docker守护程序组成的客户端 - 服务器应用程序,指定用于与守护进程交互的接口的REST API,以及与守护进程通信的命令行界面(CLI)客户端(通过REST API包装器)。
docker engine接受docker
来自CLI命令,例如docker run <image>
,docker ps
可以列出运行容器,docker image ls
列出镜像,等等。
Docker Machine是一个用于配置和管理Dockerized主机(带有Docker Engine的主机)的工具。通常,您在本地系统上安装Docker Machine。Docker Machine有自己的命令行客户端 docker-machine
和Docker Engine客户端docker
。您可以使用Machine在一个或多个虚拟系统上安装Docker Engine。这些虚拟系统可以是本地的(如使用Machine在Mac或Windows上的VirtualBox中安装和运行Docker Engine时)或远程(如使用Machine在云提供商上配置Dockerized主机时)。这些Dockerized机器就是托管在 Docker Machine上的机器
安装Docker machine
如果您在Linux上运行:
- $ base=https://github.com/docker/machine/releases/download/v0.14.0 &&
- curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
- sudo install /tmp/docker-machine /usr/local/bin/docker-machine
安装bash完成脚本
Machine资源库提供了几个bash
脚本,可添加以下功能:
- 命令完成
- 一个在shell提示符下显示活动计算机的函数
- 一个函数包装器,它添加一个
docker-machine use
子命令来切换活动机器
确认版本并将脚本保存到/etc/bash_completion.d
或 /usr/local/etc/bash_completion.d
:
- base=https://raw.githubusercontent.com/docker/machine/v0.14.0
- for i in docker-machine-prompt.bash docker-machine-wrapper.bash docker-machine.bash
- do
- sudo wget "$base/contrib/completion/bash/${i}" -P /etc/bash_completion.d
- done
然后,您需要source /etc/bash_completion.d/docker-machine-prompt.bash
在bash终端中运行,告诉您的设置,它可以找到docker-machine-prompt.bash
您之前下载的文件 。
要启用docker-machine
shell提示,请添加 $(__docker_machine_ps1)
到您的PS1
设置中~/.bashrc
。
- PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
下载virtualbox驱动
配置yum源 vi /etc/yum.repos.d/virtualbox.repo
- [virtualbox]
- name=virtualbox
- baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
- enabled=
- gpgcheck=
- repo_gpgcheck=
- gpgkey=https://www.virtualbox.org/download/oracle_vbox.asc
安装virtualbox
- yum install VirtualBox-5.2 -y
创建一个集群
本地计算机上的VM(MAC,LINUX,WINDOWS 7和8)
您需要一个可以创建虚拟机(VM)的虚拟机管理程序,因此请为您的计算机操作系统安装Oracle VirtualBox。
现在,docker-machine
使用VirtualBox驱动程序创建几个VM :
- docker-machine create --driver virtualbox myvm1
- docker-machine create --driver virtualbox myvm2
如果报下面的错:
Wrapper Docker Machine process exiting due to closed plugin server (read tcp 127.0.0.1:54344->127.0.0.1:43214: read: connection reset by peer)
Error creating machine: Error in driver during machine creation: read tcp 127.0.0.1:54344->127.0.0.1:43214: read: connection reset by peer
- docker-machine create --driver virtualbox --engine-registry-mirror https://1rqn7spi.mirror.aliyuncs.com myvm1
- docker-machine create --driver virtualbox --engine-registry-mirror https://1rqn7spi.mirror.aliyuncs.com myvm2
初始化SWARM并添加节点
第一台机器充当管理器,执行管理命令并验证工作人员加入群,第二台是工作人员。
您可以使用命令向VM发送命令docker-machine ssh
。指示myvm1
成为一个swarm管理器docker swarm init
并查找如下输出:
[root@docker11 ~]# docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (j0y6zr0u841mpm8pmxc5ldt1d) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
当其他节点需要加入以node1为领导者的群集的时候 需要携带 如上圈出来的token
- join --token SWMTKN--0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:
使用SSH时遇到问题?试试--native-ssh标志
Docker Machine 使用自己系统ssh,如果由于某种原因您在向Swarm管理器发送命令时遇到问题。只需--native-ssh
在调用ssh
命令时指定 标志:
如您所见,响应docker swarm init
包含一个预先配置的 docker swarm join
命令,您可以在要添加的任何节点上运行该命令。复制此命令,并将其发送到myvm2
via docker-machine ssh
以myvm2
将新群组作为工作者加入:
- [root@docker11 ~]# docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:2377"
- This node joined a swarm as a worker.
恭喜你,你已经创建了你的第一个群!
docker node ls
在管理器上运行以查看此群中的节点:
在群集群集上部署您的应用程序
困难的部分结束了。现在,您只需重复第3节中使用的过程即可部署到新的swarm上。请记住,只有群体管理员myvm1执行Docker命令; worker只是为了work。
docker-machine
为swarm管理器配置shell
到目前为止,您已经将Docker命令包装在docker-machine ssh
与VM通信中。另一种选择是运行docker-machine env <machine>
以获取并运行一个命令,该命令将当前shell配置为与VM上的Docker守护程序通信。此方法适用于下一步,因为它允许您使用本地docker-compose.yml
文件“远程”部署应用程序,而无需将其复制到任何位置。
键入docker-machine env myvm1
,然后复制粘贴并运行作为输出的最后一行提供的命令,以配置要与之通信的shell(myvm1
swarm管理器)。
- [root@docker11 ~]# docker-machine env myvm1
- export DOCKER_TLS_VERIFY=""
- export DOCKER_HOST="tcp://192.168.99.100:2376"
- export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1"
- export DOCKER_MACHINE_NAME="myvm1"
- # Run this command to configure your shell:
- # eval $(docker-machine env myvm1)
运行docker-machine ls
以验证它myvm1
现在是活动计算机,如旁边的星号所示。
在群集管理器上部署应用程序
现在myvm1
,您可以使用其作为群组管理器的功能,通过使用docker stack deploy
您在myvm1中使用第3节中相同命令docker-compose.yml来部署你本地的应用程序.
。此命令可能需要几秒钟才能完成,部署需要一些时间才能完成。
使用docker service ps <service_name>
swarm管理器上的 命令验证是否已重新部署所有服务。
您myvm1
通过docker-machine
shell配置连接到,并且仍然可以访问本地主机上的文件。确保您与以前位于同一目录中,其中包括docker-compose.yml文件在第三节中已经被创建
在myvm1中与以前一样,运行以下命令以部署应用程序。
现在,您可以使用第3节使用的相同docker命令。只是这一次通知的服务(和相关容器)已经在两者之间分布myvm1
和myvm2
。
你可以从IP地址来访问你的应用程序要么 myvm1
或myvm2
。
您创建的网络在它们之间共享并进行负载平衡。运行 docker-machine ls
以获取VM的IP地址,并在浏览器上访问其中任何一个,点击刷新(或只是curl
它们)。
有五种可能的容器ID都是随机循环的,这表明了是在负载平衡的提供访问。
这个两个IP地址工作的原理是群中的节点参与入口路由网格。这可确保部署在swarm中无论运行哪个容器实例某个端口的服务始终将该端口保留给自身。
下面是一个图表,说明在三节点群上的my-web
端口8080
上发布的服务的路由网格如何显示:
请记住,要在群集中使用入口网络,您需要在启用群集模式之前在群集节点之间打开以下端口:
- 端口7946 TCP / UDP用于容器网络发现。
- 端口4789 UDP用于容器入口网络。
清理并重新启动
堆栈和群
你可以拆掉堆栈docker stack rm
。例如:
- docker stack rm getstartedlab
取消设置docker-machine shell变量设置
您可以docker-machine
使用给定命令在当前shell中取消设置环境变量。
在Mac或Linux上,命令是:
- eval $(docker-machine env -u)
docker从零开始(四)集群初体验,docker-machine swarm的更多相关文章
- 【转载】 TensorflowOnSpark:1)Standalone集群初体验
原文地址: https://blog.csdn.net/jiangpeng59/article/details/72867368 作者:PJ-Javis 来源:CSDN --------------- ...
- Centos 7下VMware三台虚拟机Hadoop集群初体验
一.下载并安装Centos 7 传送门:https://www.centos.org/download/ 注:下载DVD ISO镜像 这里详解一下VMware安装中的两个过程 网卡配置 是Add ...
- 【备忘:待完善】nsq集群初体验
本机的一个节点及监控与管理后台 虚拟机中的一个节点 命令: [root@vm-vagrant nsq]# nsqd --lookupd-tcp-address=192.168.23.150:4160 ...
- Docker 搭建 etcd 集群
阅读目录: 主机安装 集群搭建 API 操作 API 说明和 etcdctl 命令说明 etcd 是 CoreOS 团队发起的一个开源项目(Go 语言,其实很多这类项目都是 Go 语言实现的,只能说很 ...
- docker~swarm搭建docker高可用集群
回到目录 Swarm概念 Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入 ...
- Sealer - 把 Kubernetes 看成操作系统集群维度的 Docker
作者 | 中弈 写在开头 身为一名技术人员,总是喜欢把自己的作品打造成理想状态呈现给别人,我非常荣幸能把集群镜像这样一个卓越的想法变成现实, 也非常开心用户使用我们的作品时对我们的高度认可. Seal ...
- Docker部署Elasticsearch集群
http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...
- Docker 构建 RabbitMQ 集群
刚开始,关于RabbitMQ集群的搭建,我找到了这篇文章:Docker 安装 RabbitMQ 集群 从而找到了第三方的RabbitMQ集群容器 rabbitmq-server 但是这个容器只有3.6 ...
- Docker搭建PXC集群
如何创建MySQL的PXC集群 下载PXC集群镜像文件 下载 docker pull percona/percona-xtradb-cluster 重命名 [root@hongshaorou ~]# ...
随机推荐
- Z.XML-Cocos2d-x开发笔记
大家都在热火朝天的使用Cocos2d-x引擎做游戏开发,那么大家不妨把过程中解决的关键问题记录在这里,做一个分享! 1.在Android平台下打开网页 1.1修改项目工程源文件 在你的项目工程源文件中 ...
- B树(B-树)
1.基本概念: M定义为树的高度,也叫阶,就是树的深度: (1).B树又称为多路平衡查找树. (2).根节点至少有两个子节点. (3).除根节点以外的非叶子节点的儿子树为[M/2,M]. (4).每个 ...
- 关于C标准
关于C标准 1. 前言 本文从英文 C-FAQ (2004 年 7 月 3 日修订版) 翻译而来.本文的 中文版权为朱群英和孙云所有. 本文的内容可以自由用于个人目的,但 是不可以未经许可出版发行. ...
- BZOJ4584 APIO2016赛艇(动态规划+组合数学)
如果值域不大,容易想到设f[i][j]为第i个学校选了j的方案数,枚举上一个学校是哪个选了啥即可,可以前缀和优化.于是考虑离散化,由于离散化后相同的数可能可以取不同的值,所以枚举第一个和其所选数(离散 ...
- Event loop的macro task和micro task
macrotask在一些文章中也被直接称为task. 一个宿主环境只有一个事件循环,但可以有多个任务队列.宏任务队列(macro task)与微任务队列(micro task)就是其中之二. 每次事件 ...
- 【BZOI 1202 狡猾的商人】
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4149 Solved: 1994[Submit][Status][Discuss] Descript ...
- 假的kd-tree小结
至今还不是很体会kd-tree这种东西,只不过体会了一种解决某些枚举问题的方法,就是当我们有一群元素,我们要到一个答案,答案在这些元素中的某个或某几个中,我们就会枚举他们,然而我们发现这样做十分低效, ...
- jQuery.getJSON跨域访问的正确使用方式(史上最傻瓜式解释)
最近花了2天时间完整的看了一遍 jQuery 的API,其中 $.getJSON(url[, data][, callback]) 方法的跨域访问解释真心看的一头雾水,大家可以从这里感受一下: htt ...
- 一些比较高效的CSS写法建议
当浏览器解析html的时候,它构造了一个文档树来展现所有被显示的元素. 它在特定的样式表中去匹配元素,根据标准的css的层叠,继承和顺序规则, 在mozilla的实现中(可能其他的也是这样),对于每一 ...
- How to reclaim space in InnoDB when innodb_file_per_table is ON
When innodb_file_per_table is OFF and all data is going to be stored in ibdata files. If you drop so ...