通过 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”