Docker允许来自多个容器的服务器通过链接和服务发现相互连接。然而,据我所知,这个服务发现是主机本地的。我想实现一个使用其他托管在不同机器上的服务的服务。
在Docker中有几种方法可以解决这个问题,比如CoreOS的< code>jumpers,本质上代理其他机器的主机本地服务,以及一大堆用于管理Docker部署的github项目,这些项目似乎都试图支持这个用例。
鉴于发展速度,很难遵循当前的最佳实践。因此,我的问题本质上是:
更新
Docker最近宣布了一个名为Swell的新工具,用于Docker编排。
Swarm允许您“加入”多个docker守护程序:首先创建一个群,在一台机器上启动一个群管理器,然后让docker守护进程使用群标识符“加入”群管理器。docker客户端连接到群管理器,就好像它是一个常规的docker服务器一样。
当容器以 Swarm 启动时,它会自动分配给满足已定义任何约束的可用节点。以下示例摘自博客文章:
$ docker run -d -P -e constraint:storage=ssd mysql
支持的约束之一是< code >“node”,它允许您将容器固定到特定的主机名。swarm还可以解析节点间的链接。
在我的测试中,我得到的印象是Swarm还不能很好地处理固定位置的卷(或者至少链接它们的过程不是很直观),所以这是需要记住的。
群现在处于测试阶段。
直到最近,大使模式还是远程主机服务发现的唯一Docker本机方法。此模式仍然可以使用,并且除了普通的 Docker 之外不需要任何魔法,因为该模式由一个或多个充当代理的附加容器组成。
此外,还有几个第三方扩展可以使 Docker 群集功能强大。第三方解决方案包括:
更新3
Libswell已重命名为swell,现在是一个单独的应用程序。
这是用作起点的github页面演示:
# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8
# on each of your nodes, start the swarm agent
# <node_ip> doesn't have to be public (eg. 192.168.0.X),
# as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>
# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>
# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ...
$ docker -H <swarm_ip:swarm_port> ps
$ docker -H <swarm_ip:swarm_port> logs ...
...
# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>
更新2
官方方法现在是使用libswarm,请看这里的演示
更新
openvswitch主机在docker中使用相同的方法进行通信有一个很好的要点。
为了允许服务发现,有一种基于DNS的有趣方法称为skydock。
还有一个截屏。
这也是一篇不错的文章,使用相同的拼图部分,但也在顶部添加了vlans:
http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html
修补与解决方案的健壮性无关。Docker实际上只是一种基于Linux容器的DSL,这些文章中的两种解决方案都简单地绕过了一些Docker自动设置,直接回到了Linux容器。
因此,您可以安全地使用这些解决方案,并等待Docker实现后,以更简单的方式来实现它。
Weave是一种新的Docker虚拟网络技术,它充当TCP/IP上的虚拟以太网交换机-您所需要的只是在主机上运行Weave的Docker-container。
有趣的是
这导致了有趣的场景,比如
例如,有一个关于如何在您的笔记本电脑和一些云(EC2)主机上创建多节点Cassandra集群的示例指南,每个主机有两个命令。我用AWS CloudFormation启动了一个CoreOS集群,在每个in /home/core上安装了weave,加上我的笔记本电脑vacator docker VM,不到一个小时就完成了一个集群。我的笔记本电脑有防火墙,但Weave似乎没问题,它只是连接到它的EC2同行。