泊坞窗应用程序和数据库在不同的容器

我有一个节点应用程序运行在一个docker集装箱,另一个是mongo数据库,第三个是redis数据库。 在开发中,我想要使用这三个容器(不污染我的系统与数据库安装),但在生产中,我想在本地安装数据库和泊坞窗应用程序。

该应用程序假定数据库正在本地主机上运行。 我知道我可以转发端口从容器到主机,但我可以转发容器之间的端口,使应用程序可以访问数据库? 端口转发不同容器上的相同端口会造成冲突。

我也知道容器将在相同的桥接networking,并使用“curl”命令,我发现他们已经连接,我可以访问他们使用他们的相对IP地址。 但是,我希望能够在不改变代码中的“localhost”规范的情况下使这个项目工作。

有没有办法转发这些端口? 也许在我的应用程序的dockerfile中使用iptables? 我希望我的应用程序的容器能够使用“localhost:27017”访问mongoDB,例如,即使它们在不同的容器中。

我正在使用Docker for Mac(V 1.13.1)。 在生产中,我们将在Ubuntu服务器上使用Docker。

我有点小菜。 感谢您的帮助。

Docker只允许您将容器端口映射到主机端口(而不是相反),但有一些方法可以实现这一点:

  • 您可以使用--net=host ,这将使容器使用您的主机networking而不是默认网桥。 你应该注意到,这可能会引起一些安全问题(因为容器可能会访问你在主机上运行的任何其他服务)。

  • 你可以在你的容器中运行一些东西来映射一个本地端口到一个远程端口(ex rinetd或者ssh隧道)。 这将基本上创build一个映射localhost:SOME_PORT – > HOST_IP_IN_DOCKER0:SOME_PORT

  • 如注释中所述,创build一些脚本来提取IP地址(例如: ifconfig docker0 | awk '/inet addr/{print substr($2,6)}' ),然后将其公开为环境variables。 假设脚本封装在名为getip的命令中,可以像这样运行它:

     $ docker run -e DOCKER_HOST=$(getip) ... 

    然后在容器中使用名为DOCKER_HOST的env var来连接你的服务。