我有一个节点应用程序在一个docker容器中运行,mongo数据库在另一个上运行,而redis数据库在第三个上运行。在开发中我想使用这三个容器(不会污染我的系统与数据库安装),但在生产中,我希望本地安装数据库和docker中的应用程序。
该应用程序假定数据库在localhost上运行。我知道我可以将容器中的端口转发到主机,但我可以在容器之间转发端口,以便应用程序可以访问数据库吗?端口转发不同容器上的相同端口会造成冲突。
我也知道容器将在同一个桥接网络上,并且使用“curl”命令我发现它们已连接,我可以使用它们的相对IP地址访问它们。但是,我希望在不更改代码中的“localhost”规范的情况下使这个项目工作。
有没有办法转发这些端口?也许在我的应用程序的dockerfile中使用iptables?我希望我的应用程序的容器能够使用“localhost:27017”访问mongoDB,例如,即使它们位于不同的容器中。
我正在使用Docker for Mac(V 1.13.1)。在生产中,我们将在Ubuntu服务器上使用Docker。
我有点像菜鸟。谢谢您的帮助。
答案 0 :(得分:1)
Docker只允许您将容器端口映射到主机端口(而不是反向),但有一些方法可以实现:
您可以使用--net=host
,这将使容器使用您的主机网络而不是默认网桥。您应该注意,这可能会引发一些安全问题(因为容器可能会访问您在主机中运行的任何其他服务)...
您可以在容器内运行某些内容以将本地端口映射到远程端口(ex 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
的env var来连接您的服务。