EC2上Docker容器无法连接RDS,主机及本地容器可正常连接
排查EC2上Docker容器无法连接RDS的方向
1. 核对Docker网络模式配置
- 检查你的
docker-compose.yml中networks字段:默认桥接模式下,容器是否能正常访问外部网络?对比本地环境的配置,看EC2上是否遗漏了网络模式设置(比如本地用了network_mode: host而EC2没配置)。 - 临时测试:在EC2上执行
docker run --network host --rm alpine nc -v <RDS_HOST> 5432启动容器测试连接,如果能通,说明是网络模式的问题。
2. 检查Docker的iptables规则
- 执行
iptables -L -n查看EC2上的iptables规则,确认是否有拦截Docker容器出站到5432端口的规则。 - 用
docker network inspect bridge(如果用默认桥接网络)查看网络配置,对比本地机器的输出,看网关、子网等是否存在差异。
3. 验证EC2的安全组与VPC NACL配置
- 确认EC2实例的安全组出站规则允许访问RDS的5432端口(可临时设置为允许所有出站,快速排除问题)。
- 检查VPC的网络访问控制列表(NACL):NACL是无状态的,需确保出站规则允许5432端口,入站规则允许RDS响应的临时端口范围(通常是1024-65535)。
4. 排查容器内的DNS解析问题
- 进入EC2上的Docker容器,执行
cat /etc/resolv.conf查看DNS配置,对比EC2实例内部的DNS设置(cat /etc/resolv.conf),看是否一致。 - 直接用RDS的IP地址测试:
nc -v <RDS_IP> 5432,如果能通,说明是域名解析失败导致的问题;如果仍不通,再排查路由。
5. 检查docker_boot.service的执行环境
- 服务文件中使用
sudo可能导致执行环境与手动操作不同,尝试直接在EC2上执行docker-compose -f /home/ubuntu/metabase/docker-compose.yml up -d --remove-orphans,看容器启动后能否连接RDS,排除服务执行的环境问题。
内容的提问来源于stack exchange,提问作者Abe Shalash
相关产品推荐
相关产品推荐

