2017-07-17 51 views
2

我有一个Docker容器必须与其他主机中的非dockerized应用程序和docker容器进行通信的情况。如何使码头集装箱与非码头应用程序交谈?

假设有三台服务器A,B和C.服务器A有两个运行JBoss App Server容器的Docker容器。服务器B,非docker主机拥有MySQL DB。服务器C有另一组容器。

我希望JBoss应用程序服务器容器与位于另一主机上的MySQL DB连接并从数据库中提取信息。 JBoss还必须谈论服务器C中的容器。

如何使这发生?

PS:我是新来的码头工人在桥/用户自定义桥接网络

回答

4

容器可以自动访问外面的世界。这是通过IP伪装发生的,Docker会照顾它。

  • MySQL数据库是在服务器B
  • 服务器A具有以到达MySQL数据库运行服务器B的路由。
  • 2容器是在服务器A

假设以上所述,2个容器应能达到MySQL数据库。

还有一个相关的常见问题有关在localhost中访问服务的容器。您可以参考这里的讨论(From inside of a Docker container, how do I connect to the localhost of the machine?

回答到更新的问题:

当您在群模式把容器覆盖网络,它还会创建一个桥接网络(docker_gwbridge)。此桥默认情况下创建用于外部访问。你是正确的,在这种情况下,容器是覆盖和桥接网络的一部分。使用覆盖网络,服务器A中的容器可以与服务器C中的容器进行通信。对于服务器A中的容器到达DB(非容器化应用程序),您只需要可以从容器内部直接访问的DB的IP地址和端口。只要数据库IP地址可以从服务器A访问,它也可以从使用桥网络在服务器A中运行的容器内访问。你不需要任何特殊的DNS标志或其他任何东西。

+0

嗨@Sreeni不可能在叠加模式下做到这一点?还有一个查询。运行命令中DNS标志的用途是什么?我可以在docker run命令中提供--dns标志指向驻留在服务器B中的数据库吗? –

+0

嗨Aditya,你可以使用覆盖网络连接2个容器,但你需要使用网桥来达到DB的IP。在覆盖网络中,docker_gwbridge提供外部连接。 DNS标志允许您使用外部DNS服务器。默认情况下,docker在Docker引擎中使用dns服务器,并在其中找不到名称,它使用主机的DNS服务器。我在这里捕获了常见的Docker网络问题和解决方案(https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques)。请看看它是否有帮助。 – Sreeni

+0

嗨@Sreeni我编辑了原始问题。 AFAIK,容器可以是多个网络的一部分。因此,A和C服务器中的容器可以利用覆盖。虽然A和MySQL DB中的容器可以利用用户定义的桥接网络。我对么?但是我仍然困惑如何让容器指向非dockerized应用程序?有没有特定的命令来实现这一点,或者是否有任何特定的标志,如--dns?我很抱歉拿出很多问题:) –