在单独的docker容器(AWS ECS)中连接到MongoDB

时间:2018-03-30 18:49:48

标签: node.js mongodb amazon-web-services docker amazon-ecs

我正在使用AWS ECS并为我的前端(节点应用)和我的后端(mongo数据库)提供容器。

mongo容器正在暴露端口27017,但我无法弄清楚如何从我的前端容器连接它。如果我尝试使用'mongodb:// localhost:27017 / db_name'连接到数据库,则会收到ECONNREFUSED错误。

我为这两个任务定义运行了一个服务,前端有一个ALB。我没有将它们放在同一个任务定义中,因为将它们放在一起似乎不是最佳的。

我尝试了多种网址

  • mongodb的://0.0.0.0:27017 / DB_NAME
  • 的mongodb://本地主机:27017 / DB_NAME

如果我从EC2实例中“卷曲”mongo容器,我会收到服务器的空回复。

数据库任务定义:

{
  "executionRoleArn": null,
  "containerDefinitions": [
    {
      "dnsSearchDomains": null,
      "logConfiguration": null,
      "entryPoint": null,
      "portMappings": [
        {
          "hostPort": 27017,
          "protocol": "tcp",
          "containerPort": 27017
        }
      ],
      "command": null,
      "linuxParameters": null,
      "cpu": 0,
      "environment": [
        {
          "name": "MONGODB_ADMIN_PASS",
          "value": <PASSWORD>
        },
        {
          "name": "MONGODB_APPLICATION_DATABASE",
          "value": <DB NAME>
        },
        {
          "name": "MONGODB_APPLICATION_PASS",
          "value": <PASSWORD>
        },
        {
          "name": "MONGODB_APPLICATION_USER",
          "value": <USERNAME>
        }
      ],
      "ulimits": null,
      "dnsServers": null,
      "mountPoints": [],
      "workingDirectory": null,
      "dockerSecurityOptions": null,
      "memory": null,
      "memoryReservation": 128,
      "volumesFrom": [],
      "image": "registry.hub.docker.com/library/mongo:latest",
      "disableNetworking": null,
      "healthCheck": null,
      "essential": true,
      "links": null,
      "hostname": null,
      "extraHosts": null,
      "user": null,
      "readonlyRootFilesystem": null,
      "dockerLabels": null,
      "privileged": null,
      "name": "mongo"
    }
  ],
  "placementConstraints": [],
  "memory": null,
  "taskRoleArn": null,
  "compatibilities": [
    "EC2"
  ],
  "taskDefinitionArn": "arn:aws:ecs:us-east-2:821819063141:task-definition/dappy_coin_database:2",
  "family": "dappy_coin_database",
  "requiresAttributes": [
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.21"
    }
  ],
  "requiresCompatibilities": null,
  "networkMode": null,
  "cpu": null,
  "revision": 2,
  "status": "ACTIVE",
  "volumes": []
}

1 个答案:

答案 0 :(得分:0)

OLD:

  

您必须在节点的任务定义中添加,我假设您拥有:links: ["mongo"]    然后,您可以参考mongo://...

NEW:

刚看到你想要它们在不同的任务定义中。这是很复杂的,我想劝阻你走这条路,因为你面临的选择如:ELB,通过DNS的服务发现,大使容器模式(每this answer - 如果这就是你想要的,这个问题是一个骗局)。如果你必须这样做,看到那个答案,然后哭泣。

也许您会考虑将Node应用程序部署为单容器Elastic Beanstalk应用程序,并将其连接到MongoDB Atlas?这样你就可以获得负载平衡,自动扩展,监控,内置所有内容,而不需要自己动手。

或者,至少您可以使用AWS Fargate。它是ECS的一种启动模式,可以为您处理更多的基础架构和网络。引用文档,

  

links是不允许的,因为它们是“网桥”网络模式的属性(现在是Docker的遗留功能)。相反,容器共享网络命名空间并通过localhost接口相互通信。可以使用以下内容引用它们:

     

localhost/127.0.0.1:<some_port_number>

在这种情况下,some_port_number = 27017