在 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 容器日志