Docker容器内Python程序无法连接192.168.0.9的MySQL服务器
针对你遇到的sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '192.168.0.9' (timed out)")错误,按以下步骤逐一排查:
先验证容器到MySQL服务器的网络连通性
进入容器内部,先ping目标IP确认网络可达:ping 192.168.0.9如果ping不通,说明容器所在网络与MySQL服务器的子网存在隔离,检查宿主机的网络路由、Docker网络配置是否有变更。
如果ping通,再测试MySQL端口(默认3306)是否开放:telnet 192.168.0.9 3306 # 或者用nc工具 nc -zv 192.168.0.9 3306端口不通的话,直接跳转到防火墙/安全组排查步骤。
检查MySQL服务器的绑定地址与用户权限
登录MySQL服务器,执行以下命令确认绑定地址是否允许外部访问:SHOW VARIABLES LIKE 'bind_address';如果结果是
127.0.0.1,说明MySQL只允许本地连接,需要修改配置文件(如my.cnf或my.ini)将bind_address改为0.0.0.0,或者添加容器所在网段的IP,然后重启MySQL服务。
同时检查连接用户的访问权限:SELECT user, host FROM mysql.user WHERE user='你的数据库用户名';如果
host字段是localhost或特定IP,需要更新权限允许容器所在网段访问:GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'容器所在网段IP' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;或者直接允许所有IP访问(仅测试用,生产环境不建议):
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;排查MySQL服务器/宿主机的防火墙与安全组
- 检查MySQL服务器的防火墙规则,确保3306端口对容器所在网段开放:
以Ubuntu的ufw为例:ufw status # 如果没有允许规则,添加: ufw allow from 容器所在子网 to any port 3306 - 如果是云服务器,检查云平台的安全组配置,确认3306端口的入站规则是否包含容器所在的公网/内网IP段。
- 检查MySQL服务器的防火墙规则,确保3306端口对容器所在网段开放:
检查Docker网络配置
查看容器的网络模式:docker inspect 你的容器名称 | grep NetworkMode如果使用默认
bridge网络仍无法访问,可临时切换为host网络模式测试(该模式下容器共享宿主机网络栈):docker run --net=host -d 你的镜像名称切换后再运行Python函数测试,如果能连接,说明原Docker网络存在路由或隔离问题,需检查自定义网络的子网配置、网关设置。
验证SQLAlchemy连接参数与依赖版本
- 确认连接字符串中的用户名、密码、IP是否正确,有没有过期或拼写错误;尝试调大
connect_timeout参数,比如改为30,排除短超时导致的连接失败:engineSql = sqlalchemy.create_engine('mysql+pymysql://...', connect_args={'connect_timeout': 30}) - 检查近期是否更新了
pymysql或sqlalchemy版本,新版本可能存在兼容性问题,回退到之前正常工作的版本测试:pip install pymysql==x.x.x sqlalchemy==y.y.y
- 确认连接字符串中的用户名、密码、IP是否正确,有没有过期或拼写错误;尝试调大
内容的提问来源于stack exchange,提问作者George Sousa

