AWS问题:EC2上Docker容器无法连接RDS MySQL数据库
排查EC2 Docker容器连接RDS超时问题
以下是针对你遇到的连接超时问题的分步排查方案:
1. 先验证EC2到RDS的基础连通性
容器默认通过EC2的网络栈访问外部资源,EC2能连通RDS是容器连通的前提:
- 在EC2实例上执行
mysql -h <你的RDS端点> -u <RDS用户名> -p,输入密码后尝试连接 - 如果这一步就超时,说明问题出在EC2和RDS的网络链路,和Docker无关,优先排查后续安全组/ACL配置
2. 安全组配置检查
RDS安全组
- 入站规则必须添加:端口3306,来源为EC2实例所在的安全组ID(不要用0.0.0.0/0,既不安全也可能因配置不当导致异常)
- 确认规则协议为TCP(MySQL默认使用TCP协议)
EC2安全组
- 出站规则允许所有流量(或至少允许到3306端口的TCP流量到RDS的安全组),默认出站规则一般为全通,若修改过需重新检查
3. VPC网络ACL检查
网络ACL是无状态的,必须双向允许流量:
- 入站ACL规则:允许TCP 3306端口,来源为EC2所在子网的CIDR
- 出站ACL规则:允许TCP 3306端口,目标为RDS所在子网的CIDR
- 不要漏掉出站回包流量,否则会出现连接停滞的情况
4. 容器环境变量与RDS端点验证
- 登录后端容器执行
docker exec <后端容器ID> env,检查RDS相关环境变量(如RDS_HOST、DB_USER、DB_PASSWORD)是否正确注入,有无拼写错误或值为空 - 确认
RDS_HOST是完整的RDS端点(格式类似xxx.xxxxxx.us-east-1.rds.amazonaws.com),而非私有IP或错误域名 - 在容器内执行
ping <RDS端点>或telnet <RDS端点> 3306,验证DNS解析和端口连通性
5. RDS实例状态与配置检查
- 确认RDS实例处于「可用(Available)」状态,避免实例处于创建、维护或故障状态
- 检查RDS参数组的
bind_address配置,RDS默认允许所有内部访问,不要被自定义参数限制 - 若尝试过开启RDS公开访问:
- 必须在RDS安全组添加本地机器的公网IP作为3306端口的来源
- 确认RDS所在VPC已配置互联网网关,且RDS子网的路由表有指向互联网网关的路由
内容的提问来源于stack exchange,提问作者JJGC
相关产品推荐
相关产品推荐

