node.js - 不同容器上的 Docker 应用程序和数据库

标签 node.js mongodb docker redis

我有一个 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/

相关文章:

spring - 在 Amazon EC2 上部署 Spring 项目

python - 从一个虚拟机连接到另一个虚拟机时,python 中的 urlopen 错误 [Errno 111] 连接被拒绝

ruby - 如何使用公共(public) swagger-generator docker 镜像生成客户端?

javascript - AngularJS - 处理手动输入 URL 状态的最佳方式

html - node.js、socket.io - 网站架构

javascript - 如何解决 Angular js 中的 json 解析问题

docker - 如何将我的Hybris项目转换为Docker镜像

Docker 镜像版本控制和生命周期管理

javascript - 让音频适用于所有浏览器

javascript - Mongoose 更新所有文档