提问者:小点点

如何在主机之间链接 Docker 服务?


Docker允许来自多个容器的服务器通过链接和服务发现相互连接。然而,据我所知,这个服务发现是主机本地的。我想实现一个使用其他托管在不同机器上的服务的服务。

在Docker中有几种方法可以解决这个问题,比如CoreOS的< code>jumpers,本质上代理其他机器的主机本地服务,以及一大堆用于管理Docker部署的github项目,这些项目似乎都试图支持这个用例。

鉴于发展速度,很难遵循当前的最佳实践。因此,我的问题本质上是:

  1. Docker中当前跨主机链接的主要方法是什么(如果有),以及
  2. 有没有计划直接在Docker系统中支持此功能?

共3个答案

匿名用户

更新

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 群集功能强大。第三方解决方案包括:

    < li >连接两台主机上的Docker网桥,存在各种各样的轻量级解决方案,但一般都有一些注意事项 < li >基于DNS的发现,例如使用skydock和SkyDNS < li >码头管理工具,如造船厂和码头协调工具。有关详细列表,请参见此问题:如何在生产中扩展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。

有趣的是

    < li >在虚拟网络中使用静态IP/主机名,而不是链接 < li >主机不需要完全连接,网状结构是根据可用的对等体形成的,数据包将通过多跳路由到它们需要去的地方

这导致了有趣的场景,比如

  • 创建一个跨WAN的虚拟网络,没有任何Docker容器会知道或关心它们所在的实际网络
  • 将容器移动到不同的物理码头主机,Weave将相应地检测对等主机

例如,有一个关于如何在您的笔记本电脑和一些云(EC2)主机上创建多节点Cassandra集群的示例指南,每个主机有两个命令。我用AWS CloudFormation启动了一个CoreOS集群,在每个in /home/core上安装了weave,加上我的笔记本电脑vacator docker VM,不到一个小时就完成了一个集群。我的笔记本电脑有防火墙,但Weave似乎没问题,它只是连接到它的EC2同行。