You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  • 若测试有效,需添加规则允许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 hostnames
    • Enable 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:44:52