4

我们dockerizing我们的微观服务的应用程序,我遇到了一些问题的发现。可以(或应该)2个码头集装箱通过本地主机互相交互?

该应用程序的配置如下:

当一个服务是“非本地”模式启动,它使用领事作为它的发现注册表。 当服务以“本地”模式启动时,它会自动绑定每个服务的地址(例如,tcp:// localhost:61001,tcp:// localhost:61002等等硬编码地址)

dockerizing应用程序(仅适用于本地模式,现在)每个服务是一个容器后(策划泊坞窗图像与码头工人,撰写,并与泊坞窗机,如果该事项) 但由于他们是一个服务不能与其他服务进行交互不在同一台机器上,tcp:// localhost:61001显然不起作用。

使用与links泊坞窗,撰写并指定localhost作为一个别名(服务是:localhost)没有工作。有2种容器可以“共享”相同的本地主机吗?

如果没有,什么是接近最好的方法? 我想过使用每个服务的特定主机名,然后在docker-compose的链接部分指定主机名。 (但我怀疑这是优雅的解决方案) 或者可能使用码头版Consul并与其集成?

此文章:How to share localhost between two different Docker containers?提供了一些有关为什么localhost不应该被搞砸的见解 - 但我仍然对这里的正确方法感到困惑。

谢谢!

+0

绑定到0.0.0.0而不是localhost,然后通过链接共享,如前所述。您不需要手动指定主机名,默认情况下它是容器名称。 – jordanm

回答

2

但是一个服务不能与另一个服务交互,因为它们不在同一台机器上,并且tcp:// localhost:61001显然不起作用。

其实他们可以。你是对的,tcp://localhost:61001将无法​​正常工作,因为在容器中使用localhost将指的是容器本身,类似于默认情况下localhost在任何系统上的工作方式。这意味着您的服务无法共享相同的主机。如果你想要它们,你可以为两种服务使用一个容器,但这实际上并不是最好的设计,因为它违背了Docker Compose的一个主要目的。

做理想的方式是搬运工,撰写的链接,引导你引用显示了如何定义它们,但实际上使用都需要在URL中使用链接的容器的名称如果链接容器的名字在原始容器的/etc/hosts中定义了一个IP映射(不是它实际上是这样做的,只是让您明白)。如果您想将其更改为与链接容器名称不同的内容,则可以使用链接别名,这在您引用的相同指南中进行了解释。

例如,一个docker-compose.yml文件是这样的:

a: 
    expose: 
    - "9999" 
b: 
    links: 
    - a 

随着a监听0.0.0.0:9999b可以ab内发出请求tcp://a:9999互动。这也将是可能的外壳为b和运行

ping a 

这将发送从b容器ping请求a容器。

因此,最后尝试用请求URL中的localhost替换为链接容器的文本名称(或链接别名,如果链接是使用别名定义的)。这意味着,

tcp://<container_name>:61001 

应改为工作的

tcp://localhost:61001 

只要确保你定义docker-compose.yml的链接。

希望这有助于

2

在生产,千万不要用码头工人或码头单独组成。使用管弦乐队(牧场主,码头群,k8s,...)并在那里部署你的堆栈。 Orchestrator将负责网络问题。您的容器可以相互链接,因此您可以直接通过名称访问它们(不必太在意ip)。

在本地主机,使用搬运工撰写来启动你的容器和使用环节。不要使用本地端口,而要使用链接的名称。 (如果您的容器A需要访问端口1234上的容器B,则执行链接B与名为BBBB的A链接,并使用tcp:// BBBB:1234从A访问容器)

如果您确实想要将端口绑定到您的本地主机并使用它,通过您的主机IP访问端口,而不是本地主机。

+0

为什么不应该在生产中使用docker-compose? – MatTheWhale

+1

如果一个容器崩溃,则不会自动重启。如果一个容器重新启动,您必须重新启动所有容器以重新同步链接(其他容器保留旧的IP)。你只能使用一台主机,规模很难,... – wargre

1

如果改变了硬编码地址是不是现在的选择,也许你可以修改你的容器启动脚本中的每个本地容器转发转发端口到其他机器所需要的服务。

虽然这会产生一些复杂性,因为您必须在每个容器中设置ssh并管理相应的密钥。

想想吧,如果加密不是问题,ssh是没有必要的。使用socatredirprobably be enough

socat TCP4-LISTEN:61001,fork TCP4:othercontainer:61001 
相关问题