【问题标题】:How can I conect a NodeJS app to a MongoDB running in a Docker container on AWS?如何将 NodeJS 应用程序连接到在 AWS 上的 Docker 容器中运行的 MongoDB?
【发布时间】:2017-09-19 09:18:19
【问题描述】:

我正在尝试将我的第一个 MEAN 堆栈应用程序(“weatherapp”)部署到 AWS 上的生产环境。

我将我的 NodeJS/Express/Angular 应用程序部署到 AWS Elastic Beanstalk(运行 Node 的预配置 Linux 机器)。这工作正常,我可以在浏览器中查看应用程序。

另外,我创建了一个运行 MongoDB 的 docker 容器,并按照本文中的步骤将其部署到 AWS / EC2: https://blog.codeship.com/running-mean-web-application-docker-containers-aws/

我的问题是 - 我如何将两者联系起来?

在我的 NodeJS 应用程序中,我像这样在本地连接到本地 Mongo 实例:

'mongodb://localhost:27017/weatherapp'

我可以采取哪些步骤来找出我在 docker 上的生产 Mongo 实例的连接字符串应该是什么?

提前致谢!

【问题讨论】:

  • 你能澄清一下零件在哪里运行吗?您是否尝试将您的应用程序(在 Elastic Beanstalk 中运行)连接到运行单个 MongoDB 容器的单个 EC2 实例?
  • 没错——NodeJS 应用程序在 Elastic Beanstalk 中运行,而 MongoDB 的单个实例在单个 EC2 实例的 Docker 容器中运行。

标签: mongodb amazon-web-services docker amazon-elastic-beanstalk


【解决方案1】:

这个问题的答案有两个。我们需要在 EC2 实例的 Docker 端设置一些选项,然后在 AWS 端设置一些安全组和配置。首先,我们将从 Docker 容器方面开始。

容器

当您运行 MongoDB 容器时,您需要做两件事:

  • 将数据保存到磁盘。
  • 打开容器的 MongoDB 端口。

要将数据持久化到磁盘,您需要执行-v /data/db:/data/db 之类的操作。这将使 MongoDB 数据在主机上的 /data/db 可用。这可确保容器的意外删除或升级不会丢失任何数据。

接下来,我们需要发布 MongoDB 端口,以便 Docker 外部的应用程序可以连接到它。默认的 MongoDB 端口是 27017,所以让我们使用 -p 27017:27017 发布它。

如果您启动 MongoDB 的原始命令是:

docker run --name mymongodb -d mongo

那么新的将是:

docker run --name mymongodb -d -p 27017:27017 -v /data/db:/data/db

AWS

现在,我们需要编辑您的 EC2 实例的安全组和 Elastic Beanstalk 的配置。

安全组

首先,在 EC2 控制台中查看您的安全组。您将拥有一个名为 awseb-e-xanf9hqrw3-stack-AWSEBSecurityGroup-1N2T1AI2H05I8 的 Elastic Beanstalk 应用程序组,其 ID 类似于 sg-07fb8c43。我们将在下一步中使用此 ID,因此请将其复制到某处。

现在找到附加到运行 Docker 容器的 EC2 实例的安全组。您需要向该组添加一个新规则,以允许访问 MongoDB 容器。编辑组并添加新的入站规则:

  • 类型:自定义 TCP
  • 协议 TCP
  • 端口范围:27017
  • 来源:sg-07fb8c43

这将允许 Elastic Beanstalk EC2 实例(使用 sg-07fb8c43)访问 Docker EC2 实例上的 MongoDB 端口。

弹性 IP

如果 EC2 实例重新启动,您可能需要一个更加静态的 IP 地址。导航到 EC2 控制台的 Elastic IPs 部分并为您的 Docker EC2 实例分配一个新地址。

新的 Elastic IP 将是您在 Elastic Beanstalk 配置中用于连接 MongoDB 的地址。如果您的地址是54.67.29.50,那么您的应用程序将连接到mongodb://54.67.29.50:27017

弹力豆茎

现在,您应该将应用程序配置为从环境变量中提取信息,而不是在您的 Node.js 应用程序中硬编码此地址。在您的应用程序中,您应该从process.env.MONGO_URI 之类的内容中读取 MongoDB URL。然后,在您的 Elastic Beanstalk 应用程序配置中,导航到软件配置,然后向下导航到环境属性。在这里,您创建一个属性名称为MONGO_URI,值为mongodb://54.67.29.50:27017。这将允许您在 MongoDB 实例发生变化或启动具有不同数据库的多个环境时轻松更改它。

【讨论】:

  • 非常感谢您的详细回答。我已经详细阅读了您的说明并进行了所有更改,但不幸的是我仍然无法从我的应用程序连接到数据库(504 网关超时)。
  • 我尝试了以下方法:1) 再次查看说明并验证所有内容 2) 使用 Mongo 删除 EC2 实例并从头开始重新创建 3) 尝试在节点应用程序中添加连接字符串作为环境变量和硬编码。 4) 尝试在 docker 容器上添加额外的入站规则,从任何位置向所有端口开放(用于临时测试)。我在生产节点应用程序中用于引用数据库的确切字符串是:mongodb://52.11.88.113:27017/weatherappdb 不确定接下来要尝试什么 - 感谢任何建议。谢谢!
  • 首先,确认您可以从 EC2 Docker 实例访问它。你能在 EC2 实例内部 telnet 52.11.88.113 27017 吗?
  • 当我使用 'docker-machine create' 创建 aws 实例时,我看到生成了一个密钥对,但我没有看到从 EC2 控制台下载它的选项。同时,我看到在 '.docker/machine/machines/aws03/' 下添加了几个 '.pem' 文件,但我不确定该使用哪个。
  • 另外,我注意到当我使用命令时:'docker run --name mymongodb -d -p 27017:27017 -v /data/db:/data/db' docker 容器立即退出.也就是说,当我运行“docker ps -a”时,我可以看到实例已经退出。我知道这是因为将容器作为后台进程运行的“-d”标志。我有点困惑,因为在生产中,我需要运行 Mongo 的容器始终运行。在 prod 中启动 docker 容器的推荐方法是什么 - 我想将它作为前台进程启动吗?再次感谢。
猜你喜欢
  • 2019-05-24
  • 2017-10-13
  • 2018-06-25
  • 2016-10-05
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
相关资源
最近更新 更多