在 AWS Elastic Beanstalk 上部署时,无法通过图像名称引用与 docker 一起使用的 RabbitMQ

Not able to refer RabbitMQ used with docker by the image name when deployed on AWS Elastic Beanstalk

我的本地计算机上有一个 docker-compose.yml 文件:

version: '3'

services:
  web: &my_web_app
    build: .
    command: gunicorn MyApp.wsgi --workers 3
    ports:
      - "80:8000"
    depends_on:
      - rabbitmq
  rabbitmq:
    image: rabbitmq:management
  celery_worker:
    <<: *my_web_app
    command: celery -A MyApp worker --autoscale=10,1 --loglevel=info
    ports: []
    depends_on:
      - rabbitmq

稍后,我将名为 web 的 docker 图像上传到我名为 myName/web:latest 的 docker 注册表。之后,我创建了一个 Dockerrun.aws.json 如下:

{
  "AWSEBDockerrunVersion": 2,
  "Authentication": {
    "Bucket": "cred-keeper",
    "Key": "index.docker.io/.dockercfg"
  },
  "containerDefinitions": [{
      "Authentication": {
        "Bucket": "cred-keeper",
        "Key": "index.docker.io/.dockercfg"
      },
      "command": [
        "celery",
        "-A",
        "MyApp",
        "worker",
        "--autoscale=10,1",
        "--loglevel=info"
      ],
      "essential": true,
      "image": "myName/web:latest",
      "name": "celery_worker",
      "memory": 175
    },
    {
      "essential": true,
      "image": "rabbitmq:management",
      "name": "rabbitmq",
      "memory": 175,
      "portMappings": [{
        "containerPort": 5672,
        "protocol": "tcp",
        "hostPort": 5672
      }]
    },
    {
      "Authentication": {
        "Bucket": "cred-keeper",
        "Key": "index.docker.io/.dockercfg"
      },
      "command": [
        "gunicorn",
        "MyApp.wsgi",
        "--workers",
        "4"
      ],
      "essential": true,
      "image": "myName/web:latest",
      "memory": 256,
      "name": "web",
      "portMappings": [{
        "containerPort": 8000,
        "hostPort": 80
      }]
    }
  ],
  "family": "",
  "volumes": []
}

名为 web 的图像是一个 Django(Python 的 Web 框架)应用程序,我曾经在其中使用 URL 访问我的 RabbitMQ 容器,其中使用了容器名称像 amqp://rabbitmq:5672 这样的应用程序,当我以前在我的本地机器上 运行 它曾经工作得很好。

但是,当我使用 Dockerrun.aws.json 将它部署到 AWS Elastic Beanstalk 时,我在 celery 容器的日志中遇到了一个错误,例如 [2020-07-24 08:29:51,709: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@rabbitmq:5672//: failed to resolve broker hostname

为什么我无法通过 URL 中容器映像的名称访问 AWS 上的 RabbitMQ,就像它在我的本地计算机上工作一样?如果不使用 amqp://rabbitmq:5672 作为我的 Django 网络应用程序上的 URL,我应该如何访问部署在 AWS 实例上的 RabbitMQ 容器?

请帮忙!

如果您在 docker-compose.yml 部分的 web 部分添加如下内容会怎样?:

links:
  - rabbitmq

并且在 Dockerrun.aws.json 中,在 celery_workerweb 下,您必须添加:

"links": [
   "rabbitmq"
]