如何跨主机链接 Docker 服务?

码头 allows servers from multiple containers to connect to each other via links and service discovery。但是,从我看来,这个服务发现是主机本地的。我希望实现一个使用托管在不同计算机上的其他服务的服务。

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

Given the pace of development it is hard to follow what current best practices are. Therefore my question is essentially:

  1. What (if any) is the current predominant method for linking across hosts in Docker, and
  2. 是否有计划直接在 Docker 系统中支持此功能?
50498 次浏览

The following article describes nicely how to connect docker containers on multiple hosts: http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/

UPDATE 3

Libwarm 已被重命名为 成群结队,现在是一个单独的应用程序。

以下是用作起点的 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

正式的方法是现在使用 自由蜂看一个演示 给你

更新

在 docker 中有一个用于 openvswitch 主机通信的 好主意,它使用相同的方法。

为了允许服务发现,有一种基于 DNS 的称为 天空码头的有趣方法。

还有一个 视频


这也是一篇很好的文章,使用了相同的拼图片段,但是在上面添加了 vlan:

Http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

补丁与解决方案的健壮性无关。Docker 实际上只是 Linux 容器上的一种 DSL,本文中的两种解决方案都只是简单地绕过一些 Docker 自动设置,直接回到 Linux 容器。

因此,您可以安全地使用这些解决方案,并且一旦 Docker 将实现它,就可以等待能够以更简单的方式来实现它。

Update

Docker 最近推出了一个名为 蜂群的新工具 宣布,用于 Docker 编排。

Swarm 允许你“加入”多个 docker 守护进程: 你首先创建一个群,在一台机器上启动一个群管理器,然后让 docker 守护进程使用群的标识符“加入”群管理器。Docker 客户端连接到群管理器,就像它是一个普通的 docker 服务器一样。

当一个容器以 Swarm 启动时,它会自动分配给一个满足已定义的任何约束的空闲节点。下面的例子摘自博客文章:

$ docker run -d -P -e constraint:storage=ssd mysql

支持的约束之一是 "node",它允许您将容器固定到特定的主机名。群还解析节点之间的链接。

在我的测试中,我得到的印象是,Swarm还不能很好地处理固定位置的卷(或者至少连接它们的过程不是很直观) ,所以这是需要牢记在心的。

Swarm is now in beta phase.


Until recently, the 帕丁大使 was the only Docker-native approach to remote-host service discovery. This pattern can still be used and doesn't require any magic beyond plain Docker in that the pattern consists of one or more additional containers that act as proxies.

此外,还有一些第三方扩展可以使 Docker 集群化。第三方解决方案包括:

  • Connecting the Docker network bridges on two hosts, lightweight and various solutions exist, but generally with some caveats
  • 基于 DNS 的发现,例如使用 天空码头和 SkyDNS
  • Docker 管理工具,如 造船厂和 Docker 编排工具

可以使用 Open vSwitch 或 Tinc 将多个 Docker 子网连接在一起。我已经准备好了要点来展示如何做到这一点:

我认为使用这种解决方案而不是 --link选项和大使模式的好处是,我发现它更加透明: 不需要额外的容器,更重要的是,不需要在主机上公开端口。实际上,我认为 --link选项是一个临时的黑客,在 Docker 得到一个关于多主机(或多守护进程)设置的更好的故事之前。

注意: 我知道有另一个答案指向我的第一个要点,但我没有足够的业力来编辑或评论这个答案。

Weave is a new Docker virtual network technology that acts as a virtual ethernet switch over TCP/UDP - all you need is a Docker container running Weave on your host.

What's interesting here is

  • Instead of links, use static IPs/hostnames in your virtual network
  • 主机不需要完全的连接,一个网格是根据什么对等点是可用的,并且数据包将被路由多跳到他们需要去的地方

这导致了一些有趣的情况,比如

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

例如,有一个关于如何在笔记本电脑上创建多节点 Cassandra 集群的 示例指南,还有一些云(EC2)主机,每个主机有两个命令。我使用 AWS CloudForm 启动了一个 CoreOS 集群,在/home/core 中的每个集群上安装了交织,加上我的笔记本电脑闲置的 docker VM,不到一个小时就建立了一个集群。我的笔记本电脑有防火墙,但 Weave 似乎不介意,它只是连接到它的 EC2同行。

如上所述,绝对是一个可行的解决方案,可以跨主机链接 Docker 容器。根据我自己的经验,设置它是相当直接的。它现在也有 域名服务,你可以通过它的 DNS 名称地址容器的。

另一方面,还有 CoreOS 的 Flannel 和 Juniper 的 Opencontrack,用于在主机之间连接容器。

更新

Docker 1.12 contains the so called swarm mode and also adds a service abstraction. They probably aren't mature enough for every use case, but I suggest you to keep them under observation. The swarm mode at least helps in a multi-host setup, which doesn't necessarily make linking easier. The Docker-internal DNS server (since 1.11) should help you to access container names, if they are well-known - meaning that the generated names in a Swarm context won't be so easy to address.


With the Docker 1.9 release you'll get built in 多主机联网多主机联网. They also provide an 示例脚本 to easily provision a working cluster.

您将需要一个 K/V 存储(例如领事) ,它允许在每个主机上的不同 Docker 引擎之间共享状态。每个 Docker 引擎都需要配置该 K/V 存储,然后您可以使用 Swarm 连接您的主机。

然后创建一个新的覆盖网络,如下所示:

$ docker network create --driver overlay my-network

现在可以使用网络名称作为 run 参数运行容器:

$ docker run -itd --net=my-network busybox

它们也可以在已经运行时连接到网络:

$ docker network connect my-network my-container

更多细节可在 文件中获得。

看起来码头群 1.14允许你:

  • 将主机名传递给容器,使用 --hostname标签,但是我还没有能够使它工作,容器不能够通过指定的主机名来 ping 对方。

  • 使用 --constraint 'node.hostname == <host>'将服务分配给机器