在 AWS Beanstalk 中的 docker 网络中的 docker 容器之间进行通信

Posted

技术标签:

【中文标题】在 AWS Beanstalk 中的 docker 网络中的 docker 容器之间进行通信【英文标题】:Communicate between docker containers in a docker network in AWS Beanstalk 【发布时间】:2021-08-30 07:19:30 【问题描述】:

我正在使用 AWS Beanstalk 将我的项目部署在“在 64 位 Amazon Linux 上运行的多容器 Docker”中

根据文档,这是我的 Dockerrun.aws.json


    "AWSEBDockerrunVersion": 2,
    "containerDefinitions": [
      
        "name": "child",
        "image": "nithinsgowda/child",
        "essential": true,
        "memory": 256,
        "portMappings": [
            
              "hostPort": 9000,
              "containerPort": 9000
            
        ],
        "links": [
          "master"
        ]
      ,
      
        "name": "master",
        "image": "nithinsgowda/master", 
        "essential": true,
        "memory": 512,
        "portMappings": [
          
            "hostPort": 80,
            "containerPort": 8080
          
        ],
        "links": [
          "child"
        ]
      
    ]
  

我可以从公共互联网的 80 端口访问我的主容器

在我的主容器中,我要对子容器进行 API 调用 我尝试了以下选项: 他们都没有工作

fetch('http://child/api')
fetch('http://child:9000/api')
fetch('http://15.14.13.12:9000/api')   //My public DNS for the beanstalk application (Example)

如果它在本地 docker-compose 环境中,'http://child/api' 工作得很好。但这不适用于 Beanstalk。

如何从我的主容器与子容器通信?

我什至尝试了bindIP属性并分配了本地IP并尝试使用本地IP访问它,它仍然不起作用

查看服务器日志时,环境执行了 docker ps 并且两个容器都已启动并运行,端口映射也显示正确。

【问题讨论】:

【参考方案1】:

这是您需要在 Dockerrun.aws.json 中指定的内容

"containerDefinitions": [
      
        "name": "child",
        "image": "nithinsgowda/child",
        "essential": true,
        "memory": 256,
        "portMappings": [
            
              "hostPort": 9000,
              "containerPort": 9000
            
        ],
        "links": [
          "master"
        ],
        "environment": [
          
            "name": "Container",
            "value": "child"
          
        ]
      ,

名为 Container 的环境变量将是您在网络中的容器的名称。


    "environment": [
          
            "name": "Container",
            "value": "child"     //Any custom name accepted
          
        ]

因此在指定环境变量后,我现在可以通过 fetch('http://child:9000/api') 访问子容器

这里是指定上述内容的AWS官方文档链接https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_v2config.html#create_deploy_docker_v2config_dockerrun

【讨论】:

以上是关于在 AWS Beanstalk 中的 docker 网络中的 docker 容器之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dockerrun.aws.json 和 Elastic Beanstalk 命名 Docker 容器

Python 3.4 Docker 容器中的 AWS Elastic Beanstalk container_commands

在 Docker 中为 AWS Elastic Beanstalk 构建期间访问 .env 变量

AWS beanstalk 环境没有轮换 docker 容器日志

AWS Elastic Beanstalk Docker 环境变量

AWS BeansTalk 公开 docker 端口