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

Posted

技术标签:

【中文标题】在单独的 docker 容器 (AWS ECS) 中连接到 MongoDB【英文标题】:Connect to MongoDB in separate docker container (AWS ECS) 【发布时间】:2018-09-09 19:29:27 【问题描述】:

我正在使用 AWS ECS,并为我的前端(Node 应用程序)和后端(mongo 数据库)提供了一个容器。

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

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

我已经尝试了多种 url 变体

mongodb://0.0.0.0:27017/db_name mongodb://localhost: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": []

【问题讨论】:

仅仅因为 mongo 暴露了该端口并不意味着 mongo 运行的容器暴露了该端口。你的配置是什么样的? 不确定这是否是您需要的,但我将包含 mongo 容器的任务定义 JSON 放在 post 中 Mongo 需要绑定正确的 IP 和端口,并且容器需要公开该端口(如果您使用的是 EC2,那也需要公开该端口)。 在 "docker ps" 中,它在 Mongo 容器上显示 0.0.0.0:27017->27017/tcp。此外,安全组似乎正在工作,因为它们没有超时问题,并且我暴露了端口 为什么连接 URL 中有http?你有http interface running 吗?您尝试从哪里连接到环回 IP? 【参考方案1】:

旧:

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

新:

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

也许您会考虑将您的 Node 应用程序部署为单容器 Elastic Beanstalk 应用程序,并将其连接到 MongoDB Atlas?这样一来,您就可以获得内置的负载平衡、自动缩放、监控功能,而无需自己动手。

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

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

localhost/127.0.0.1:&lt;some_port_number&gt;

在这种情况下,some_port_number = 27017

【讨论】:

以上是关于在单独的 docker 容器 (AWS ECS) 中连接到 MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

将多个 docker 容器部署到 AWS ECS

我们可以在 AWS ECS docker 容器上挂载 EFS 吗?

Docker 容器在使用 AWS ECR 的 AWS ECS 中不起作用

显示docker容器登录aws ECS集群

Docker 在 AWS ECS 中运行

AWS ECS Docker 容器 Boto3 IAM 权限