我如何将一个NodeJS应用绑定到在AWS上的Docker容器中运行的MongoDB?

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

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

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

我的问题是 – 我怎么连接两个?

在我的NodeJS应用程序中,我本地连接到本地Mongo实例,如下所示:

'mongodb的://本地主机:27017 / weatherapp'

我可以采取哪些步骤来找出连接string应该用于我的生产Docker上的Mongo实例?

提前致谢!

答案是双重的。 我们需要在EC2实例的Docker端设置一些选项,然后在AWS端设置一些安全组和configuration。 首先,我们将从Docker容器开始。

容器

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

  • 坚持数据到磁盘。
  • 打开容器的MongoDB端口。

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

接下来,我们需要发布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的configuration。

安全组

首先,看看EC2控制台中的安全组。 您将为Elastic Beanstalk应用程序创build一个类似于awseb-e-xanf9hqrw3-stack-AWSEBSecurityGroup-1N2T1AI2H05I8 ,其ID与sg-07fb8c43类似。 我们将在下一步使用这个ID,以便将其复制到某个地方。

现在find连接到运行Docker容器的EC2实例的安全组。 你将需要添加一个新的规则到这个组,允许访问MongoDB容器。 编辑该组并为以下内容添加新的入站规则:

  • types:自定义TCP
  • 协议TCP
  • 港口范围:27017
  • 来源:sg-07fb8c43

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

弹性IP

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

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

弹性豆茎

现在,不要在Node.js应用程序中对此地址进行硬编码,而应该将应用程序configuration为从环境variables中提取信息。 在你的应用程序中,你应该读取类似于process.env.MONGO_URI的MongoDB URL。 然后,在Elastic Beanstalk应用程序configuration中,导航到“软件configuration”,然后到“环境属性”。 在这里,您创build一个属性名称MONGO_URI和值为mongodb://54.67.29.50:27017 。 这将允许您轻松更改MongoDB实例,如果它发生更改或者如果您启动具有不同数据库的多个环境。