2014-12-20 44 views
2

应用程序服务器作为一个Docker容器运行,并在另一个容器中运行数据库。获得数据库服务器的IP地址为:与Docker跨容器通信

sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' db 

设置JDBC资源的应用服务器来指向数据库给出“java.net.ConnectException”。

链接容器不是一个选项,因为它只适用于相同的主机。

如何确保数据库容器的IP地址对应用程序服务器容器可见?

+2

你尝试过这样的:https://docs.docker.com/articles/ambassador_pattern_linking/ –

回答

0

链接容器不是一个选项,因为它只适用于相同的主机。

那么你说你的应用程序是在码头服务器1上运行的容器,而你的数据库是码头服务器2上的容器?如果是这样,你就像普通的远程主机一样对待它。您的数据库端口需要在Docker服务器2上公开,并且该IP:端口需要通过环境变量配置到您的应用程序服务器中。

+0

他们都在同一主机上运行。如何将db容器的IP公开到同一主机上的应用服务器容器? –

+0

他们是在同一主机上还是不在你的意见和问题是矛盾的 –

+0

首先,他们在同一主机上,但我想要一个可以跨越多个主机的解决方案。 –

0

每个主机码头子网络是Private Network。也许可以让这个地址可路由,但这会很痛苦。由于容器IP不是静态的,因此更加复杂。

您需要做的是将端口/服务发布到主机(通过dockerfile中的PORT和docker运行中的-p)然后您只需执行host-> host。您可以通过IP,环境变量或旧的DNS解析主机。

+0

暴露端口很简单。如何将db容器的IP公开到同一主机上的应用服务器容器? –

+0

将端口发布到主机后,它就是主机。 Docker负责路由以将其发送到容器。 – user2105103

1

如果要在远程主机上的码头集装箱之间建立私人网络连接,您可以使用weave在码头集装箱之间设置覆盖网络。如果您不需要专用网络,只需使用-p开关显示端口,并将主机的地址配置为所需泊坞窗容器中的目标IP。

+0

我是否需要配置容器的地址,然后使其可访问? –

+0

不,它的IP地址与您的主机相同。使用-p HOST_PORT:CONTAINER_PORT。 (如果你在boot2docker上,这不是真的,因为你需要做更多的转发) –

1

解决此问题的一个简单方法是使用Weave。它允许您创建许多可以跨越多个主机以及数据中心的特定于应用程序的网络。它也有一个非常整齐的基于DNS的服务发现机制。

我应该放弃,我是Weave工程团队之一。

0

事情很少失踪了未允许跨容器通信:

  • WildFly未绑定到0.0.0.0并因此只接受上eht0请求。这是使用“-b 0.0.0.0”修复的。
  • 防火墙不允许容器通信。这是使用删除“systemctl停止防火墙; systemctl禁用防火墙”
  • 虚拟盒图像所需的唯一主机适配器

在此之后,容器是能够沟通。完整的细节,请访问:

http://blog.arungupta.me/2014/12/wildfly-javaee7-mysql-link-two-docker-container-techtip65/