UDN-企业互联网技术人气社区

板块导航

浏览  : 1503
回复  : 0

[Docker资讯] 如何使用Docker Machine创建Swarm集群

[复制链接]
哥屋恩的头像 楼主
发表于 2016-5-23 20:13:10 | 显示全部楼层 |阅读模式
  与Docker Compose一样,Docker Machine 也是旨在帮助开发人员快速使用Docker的工具。具体地说,就是Machine允许Windows和OS X用户在诸如 Amazon AWS、Google Container Engine、Azure、DigitalOcean等公有云上远程创建Docker主机。Docker客户端安装在本地,你就可以通过它远程访问Docker的API,能达到好像Docker引擎就运行本地一样的体验。Machine需要安装在客户机本地,是用来创建远程Docker主机的单独二进制文件。本地Docker客户端甚至可以是运行在VirtualBox虚拟机上的Docker。它的源代码托管在GitHub。

  在这篇文章中,我先简单介绍Docker Machine,再讲述怎么用它创建Swarm Docker集群。一旦你从单机测试过度到多机器分布式部署,这工具相当有用。Docker Compose用来启动你在Swarm集群中的应用,这个我会在以后的文章中详细叙述。

  首先,你的机器上应该安装Docker Machine,官方的文档是最好的参考工具。第一步,我将介绍一个此文档中高亮的执行命令。

  安装Docker Machine

  与安装Docker Compose相似,你可以从GitHub的release分支中获取Machine的二进制安装文件,也可以下载源代码自己编译安装或者安装Docker ToolBox,ToolBox打包了所有的Docker工具,提供UI界面的安装。

  例如,在OS X 机器上,你可以在Github上获取安装文件,并存储在 /usr/local/bin/Docker-machine路径下,然后赋予可执行权限,可以通过测试版本的方式测试是否安装正确。例如:

  
  1. $ sudo curl -L https://github.com/Docker/machine/releases/download/v0.6.0/

  2.   Docker-machine-`uname -s`-`uname -m` > /usr/local/bin/Docker-machine

  3.   $ sudo chmod +x /usr/local/bin/Docker-machine

  4.   $ Docker-machine version

  5.   Docker-machine version 0.6.0, build e27fb87
复制代码


  因为Machine创建的实例在云端,Docker 引擎安装在云端的Docker中,所以要设置好客户端和Docker引擎正确的TSL验证权限。但是你还是要先要确认你本地是否安装了Docker。如果本地还未安装,在OS X中可以通过Homebrew安装Docker。

  
  1. $ brew install Docker
复制代码

  现在应该准备好创建第一个Docker Machine了。

  使用Docker Machine

  像我先前提及的,你可以用Machine在公有云平台上开启一个实例,但是你也可以在VirtualBox等虚拟机上安装Docker引擎到Docker中。在本地客户端,就好像所有的Docker 引擎运行在本地本地一样。在深入使用公有云服务之前,先让我们体验测试一下安装在VirtualBox上。

  Docker-machine有一个Create命令,可以把名字传递进入命令,指定创建的名字。如果还未创建任何实例,可以指定创建名字为default,下面的命令演示创建的过程:

  1. $ Docker-machine create -d virtualbox default

  2. Running pre-create checks...

  3. <snip>

  4. Docker is up and running!

  5. To see how to connect your Docker Client to the Docker Engine
  6. running on this virtual machine, run: Docker-machine env default
复制代码


  命令执行后Machine就被创建,你将看到一个default的VM运行在VirtualBox上。用这个Machine可以配置本地Docker客户端,用到env命令完成:

  
  1. $ Docker-machine env default

  2.   export Docker_TLS_VERIFY="1"

  3.   export Docker_HOST="tcp://192.168.99.102:2376"

  4.   export Docker_CERT_PATH="/Users/sebastiengoasguen/.Docker/machine/machines/default"

  5.   export Docker_MACHINE_NAME="default"

  6.   # Run this command to configure your shell:

  7.   # eval $(Docker-machine env default)

  8.   $ eval $(Docker-machine env default)

  9.   $ Docker ps
复制代码


  当然,你的IP地址可能会不同,证书的路径也可能会不同。Docker客户端将会使用设置的相同的环境变量通过Docker API与运行在上面的机器互相通信。设置完成后,就可以在本地机器访问远程Docker。

  在这个阶段,你就可以在OS X或者Windows上开启容器。

  的确,你可以使用相同的命令在不同的共有云平台启动Docker,也能启动Docker集群。

  每一个云平台的提供者都有自己完备的参考文档,如果你选择了其中的一家服务,请确保检查如何设置一些关键变量:例如权限秘钥或者令牌。这些可以工作设置环境变量实现,也可以直接通过Docker-machine命令的参数传递。

  使用Docker Machine创建Swarm集群

  有一个关键点,我们目前只有一个主机,如果真的想运行大规模分布式应用程序,我们将访问Docker主机的一个集群以便这些集群可以运行多个主机。对Docker来讲,一个Docker集群就叫做Swarm。谢天谢地,Docker Machine允许创建Swarm。不过请注意,你还可以使用比较有名的配置管理工具诸如Ansible、Chef、Puppet来创建集群,也可以使用其他的一些工具,比如Terraform。

  在这一段,为了利用网络覆盖我们的集群,我直接介绍一些比较高级的配置方法。后端支持很过键值对的存储,但是这里我们使用了Consul,通常consul作为容器运行在我们创建的Docker Machine上,对主机暴露端口号。额外的节点(例如一个主节点和几个副节点)通过Docker Machine开始运行。他们每一个都会到达键值对存储,这样有助于管理集群,管理网络的覆盖。简单的设置你可以参考使用手册,这里不再赘述。

  现在我们在DigitalOcean创建一个Machine。你必须要设置一个访问Token,也不要忘了检查下公有云平台提供的指导手册。跟VirtualBox创建不同的地方在设置集群名字。一旦机器已经正在运行,环境变化设置完成,你就可以在主机上创建一个Consul容器。下面是一下操作:

  1. $ Docker-machine create -d digitalocean kvstore

  2. $ eval $(Docker-machine env kvstore)

  3. $ Docker run --name consul --restart=always -p 8400:8400 -p 8500:8500 \
  4. -p 53:53/udp -d progrium/consul -server -bootstrap-expect 1 -ui-dir /ui
复制代码


  既然我们的键值对存储正在运行,我们就准备一个swarm主节点。我们可以使用Docker Machine中的--swarm 和swarm-master选项完成这个操作。用我们创建的键值对配置Docker引擎。

  1. $ Docker-machine create -d digitalocean --swarm --swarm-master \

  2. --swarm-discovery="consul://$(Docker-machine ip kvstore):8500" \

  3. --engine-opt="cluster-store=consul://$(Docker-machine ip kvstore):8500" \

  4. --engine-opt="cluster-advertise=eth0:2376" swarm-master
复制代码


  一旦swarm master运行,你就可以增加你想要的更过的节点。例如下面这一个,移除了命令中的--swarm-master选项:

  1. $ Docker-machine create -d digitalocean --swarm \

  2. --swarm-discovery="consul://$(Docker-machine ip kvstore):8500" \

  3. --engine-opt="cluster-store=consul://$(Docker-machine ip kvstore):8500" \

  4. --engine-opt="cluster-advertise=eth0:2376" swarm-node-1
复制代码


  现在你就有一个运行在DigitalOcean上的Docker集群了。使用Docker-machine ls`查看输出,你会查到默认的机器运行在VirtualBox ,还有其他几台机器,包括键值对存储,swarm master,还有你创建的几个节点。

  1. $ Docker-machine ls

  2. NAME           ACTIVE      DRIVER         URL   SWARM                   Docker   

  3. default        -           virtualbox     ...                           v1.10.3   

  4. kvstore        -           digitalocean   ...                           v1.10.3   

  5. swarm-master   * (swarm)   digitalocean   ...   swarm-master (master)   v1.10.3   

  6. swarm-node-1   -           digitalocean   ...   swarm-master            v1.10.3
复制代码


  Machine 是非常有用的,使得机器之间非常容易转换,也帮助我们测试本地的机器和部署到云端的机器。

  使用集群或者本地安装

  使用Docker-machine ls命令输出查询到运行中的Machine都是独立的。这就意味着如果有两个终端其中一个设置默认基于VirtualBox机器,这个就是那个正在运行的,另外的一台就指向Swam master。这样通过终端就可以实现转换Docker的endpoints。同样我们可以用这种方式在swarm上测试Docker compose本地文件。

  指向你的Swarm,跟单个主机的命令语法略有不同,你需要传递--swarm选项到Docker env,例如:

  
  1. $ Docker-machine env --swarm swarm-master

  2.   $ eval $(Docker-machine env --swarm swarm-master)
复制代码

  使用Docker info可以检查你的集群是否正确。你可以看到你的master节点和其他节点的信息。例如:

  1.   $ Docker info

  2. <snip..>

  3. Nodes: 2

  4. swarm-master: 45.55.180.111:2376

  5. └ Status: Healthy

  6. └ Containers: 2

  7. └ Reserved CPUs: 0 / 1

  8. └ Reserved Memory: 0 B / 513.4 MiB

  9. └ Labels: executiondriver=native-0.2, kernelversion=4.2.0-27-generic,
  10. operatingsystem=Ubuntu 15.10, provider=digitalocean, storagedriver=aufs

  11. └ Error: (none)

  12. └ UpdatedAt: 2016-03-20T17:59:15Z

  13. swarm-node-1: 104.131.180.199:2376

  14. └ Status: Healthy

  15. └ Containers: 1

  16. └ Reserved CPUs: 0 / 1

  17. └ Reserved Memory: 0 B / 513.4 MiB

  18. └ Labels: executiondriver=native-0.2, kernelversion=4.2.0-27-generic,
  19. operatingsystem=Ubuntu

  20. <snip…>
复制代码


  在这个例子中我用了基于键值对存储发现机制的Consul ,你可能还想了解其他的机制。既然我们已经有创建好的Swarm,我们就可以在集群上仔细研究。

  为了确保容器之间的相互通信,而不用关注正在运行的节点,在下篇文章中重点讲一下Docker中基于libnetwork 如何覆盖网络,附加一部分Docker引擎内容。如果想获取更多的信息,请关注libnetwork项目。

原文作者:ylzhang  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部