通过 Beanstalk 部署的 Docker 容器无法连接到 RDS 上的数据库
Posted
技术标签:
【中文标题】通过 Beanstalk 部署的 Docker 容器无法连接到 RDS 上的数据库【英文标题】:Docker container deployed via Beanstalk cannot connect to the database on RDS 【发布时间】:2018-11-25 09:10:01 【问题描述】:我是 docker 和 AWS 的新手。我刚刚创建了我的第一个 docker 镜像。该应用程序是一个后端微服务,带有将数据保存在 mysql 数据库中的 rest 控制器。我在 RDS 中手动创建了数据库,在本地运行容器后,其余 API 在 Postman 中工作正常。
这里是 Dockerfile:
FROM openjdk:8-jre-alpine
MAINTAINER alireza.online
COPY ./target/Practice-1-1.0-SNAPSHOT.jar /myApplication/
COPY ./target/libs/ /myApplication/libs/
EXPOSE 8080
CMD ["java", "-jar", "./myApplication/Practice-1-1.0-SNAPSHOT.jar"]
然后我通过 AWS Beanstalk 部署了 docker 映像。这是 Dockerrun.aws.json:
"AWSEBDockerrunVersion": "1",
"Image":
"Name": "aliam/backend",
"Update": "true"
,
"Ports": [
"ContainerPort": "8080"
],
"Logging": "/var/log/nginx"
一切顺利:
但是现在,我在尝试运行“backend.us-east-2.elasticbeanstalk.com/health”时在邮递员中收到“502 Bad Gateway”。
我查看了 Beanstalk 上的日志,发现应用程序连接到 RDS 数据库时出现问题:
“无法创建与数据库服务器的连接。尝试重新连接 3 次。放弃。”
我试图解决这个问题的方法:
1- 我尝试将 EC2 实例使用的相同安全组分配给我的 RDS 实例,但没有成功。
2- 我尝试在安全组上制定更多入站规则以添加 EC2 实例的公共和私有 IP,但我不确定我应该定义的端口和 CIDR 并且无法实现。
任何评论将不胜感激。
【问题讨论】:
【参考方案1】:以下是您堆栈中的资源: LoadBalancer -> EC2 实例 -> MySQL 数据库
他们都需要分配安全组,允许在正确的端口上连接到上游资源。
因此,如果您将 sg-1234
安全组分配给您的 EC2 实例,并将 sg-5678
分配给您的 RDS 数据库,则sg-5678
中必须存在一条规则,允许来自 sg-1234
的入站连接(不需要 CIDR ,您可以打开从 SG 到 SG 的连接)。典型的 MySQL 端口是 3306。
同样,LoadBalancer(由 ElasticBeanstalk 自动为您创建)必须有权访问您的 EC2 实例的 8080 端口。此外,如果您想使用“backend.us-east-2.elasticbeanstalk.com/health”域名访问您的实例,负载均衡器必须侦听端口 80 并在 8080 端口上拥有您的实例的目标组。
希望这会有所帮助!
【讨论】:
以上是关于通过 Beanstalk 部署的 Docker 容器无法连接到 RDS 上的数据库的主要内容,如果未能解决你的问题,请参考以下文章
Elastic Beanstalk 上的 WebSockets 与 Docker
AWS Elastic Beanstalk 上的闪亮服务器与 Docker
使用 docker compose 部署超过 4 个容器时,Elastic beanstalk 部署失败
将 react 应用的 docker 镜像部署到 Elastic beanstalk
在 Elastic Beanstalk 上部署 Docker 环境
将 Docker 部署到 AWS Elastic Beanstalk:无法执行命令“docker pull maven”