EC2实例中Docker容器间MySQL连接失败排查求助
排查EC2上Docker容器互联失败的可能原因
以下是针对EC2环境下Spring Boot容器无法连接MySQL容器的核心排查方向,重点聚焦EC2配置及Docker在EC2上的特殊行为:
1. EC2实例本地防火墙拦截
部分EC2官方AMI(如Amazon Linux 2、Ubuntu Server)默认启用本地防火墙(firewalld/ufw),可能拦截Docker桥接网络的内部流量:
- 临时关闭防火墙测试:
- Amazon Linux 2:
sudo systemctl stop firewalld - Ubuntu:
sudo ufw disable
- Amazon Linux 2:
- 若测试有效,需添加规则允许Docker桥接网段(默认
172.17.0.0/16)的双向通信,而非长期关闭防火墙。
2. Docker网络配置问题
本地Mac的Docker网络基于HyperKit虚拟化,与EC2上的原生Linux Docker网络存在差异:
- 确保两个容器处于同一Docker网络:
- 查看容器所属网络:
docker inspect <容器ID/名称> | grep Networks - 若使用默认桥接网络,需确认Docker的iptables转发功能正常:执行
docker info,检查IPv4 Forwarding是否为true;若为false,执行sudo sysctl -w net.ipv4.ip_forward=1,并写入/etc/sysctl.conf永久生效。
- 查看容器所属网络:
- 禁止Spring Boot配置中使用
localhost作为MySQL地址:容器内的localhost指向自身,需改用MySQL容器名称(如jdbc:mysql://mysql-db:3306/your_db)或Docker内部IP(通过docker inspect mysql-db获取)。
3. VPC DNS解析配置缺失
若依赖容器名称进行DNS解析访问MySQL,需确保EC2所在VPC的DNS配置正确:
- 登录AWS控制台,进入对应VPC的设置页面,确认已启用:
Enable DNS hostnamesEnable DNS resolution
- 若未启用,开启后重启EC2实例,Docker容器间的DNS解析才能正常工作。
4. SELinux强制访问控制限制
Amazon Linux 2等实例默认启用SELinux,可能阻止Docker容器间的网络通信:
- 临时关闭SELinux测试:
sudo setenforce 0 - 若测试有效,需添加SELinux策略允许Docker容器的网络行为,而非长期关闭:执行
sudo yum install -y container-selinux(Amazon Linux)或对应发行版的容器SELinux包。
5. 安全组/网络ACL的误限制
虽然容器间通信属于EC2实例内部流量,安全组默认不拦截,但需注意:
- 若将MySQL容器端口映射到EC2实例端口(如
-p 3306:3306),且Spring Boot通过EC2私有IP访问,需确保安全组入站规则允许3306端口来自Spring Boot容器所在的Docker网段(如172.17.0.0/16)。 - 网络ACL需允许VPC内部的双向TCP流量(端口3306及Docker内部通信端口)。
内容的提问来源于stack exchange,提问作者kailoon
相关产品推荐
相关产品推荐

