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=1 gpgcheck=1 repo_gpgcheck=1 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-1-0qssxg0zv4oll1pnhncwjn6k3donqnemfgxb4ez9o2wiutcyb2-birg7d8tnphhqkmc2dtphf0t6 192.168.99.100:2377
使用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="1" 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)