我有一个 Node 应用程序在一个 docker 容器中运行,在另一个容器中运行一个 mongo 数据库,在第三个容器中运行一个 redis 数据库。在开发中,我想使用这三个容器(不要用数据库安装污染我的系统),但在生产中,我想在本地安装数据库,在 docker 中安装应用程序。
该应用假定数据库在本地主机上运行。我知道我可以将端口从容器转发到主机,但我可以在容器之间转发端口以便应用程序可以访问数据库吗?端口转发不同容器上的相同端口会造成冲突。
我也知道容器将在同一个桥接网络上,使用“curl”命令我发现它们已连接并且我可以使用它们的相对 IP 地址访问它们。但是,我希望在不更改代码中的“localhost”规范的情况下使该项目正常运行。
有没有办法转发这些端口?也许在我的应用程序的 dockerfile 中使用 iptables?我希望我的应用程序的容器能够使用“localhost:27017”访问 mongoDB,例如,即使它们位于不同的容器中。
我正在使用 Docker for Mac (V 1.13.1)。在生产环境中,我们将在 Ubuntu 服务器上使用 Docker。
我有点菜鸟。谢谢您的帮助。
最佳答案
Docker 只允许您将容器端口映射到主机端口(而不是相反),但有一些方法可以实现这一点:
您可以使用
--net=host
,这将使容器使用您的主机网络而不是默认网桥。您应该注意,这可能会引发一些安全问题(因为容器可能会访问您在主机中运行的任何其他服务)...您可以在您的容器内运行一些东西来将本地端口映射到远程端口(例如
rinetd
或 ssh 隧道)。这基本上会创建一个映射localhost:SOME_PORT
-->HOST_IP_IN_DOCKER0:SOME_PORT
如评论中所述,创建一些脚本来提取 IP 地址(例如:
ifconfig docker0 | awk '/inet addr/{print substr($2,6)}'
) ,然后将其公开为环境变量。 假设该脚本包含在名为getip
的命令中,您可以这样运行它:$ docker run -e DOCKER_HOST=$(getip) ...
然后在容器内使用名为
DOCKER_HOST
的环境变量来连接您的服务。
关于node.js - 不同容器上的 Docker 应用程序和数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42332118/