Docker容器中执行Python MySQL更新操作时出现连接丢失错误
解决Docker容器中Python连接AWS MySQL时的2013连接丢失问题
可能原因及排查解决方案
1. 容器与AWS MySQL的网络连通性验证
Docker容器的网络环境和本地存在差异,先确认容器能正常访问目标数据库:
- 进入容器测试网络可达性:
docker exec -it <容器ID/名称> ping aws_database # 或测试端口连通性 docker exec -it <容器ID/名称> telnet aws_database 3306 - 若不通,检查AWS安全组配置:确保MySQL实例的安全组规则允许Docker宿主机IP(或容器所在网段)访问3306端口,不要仅开放本地IP。
- 确认域名解析:如果
aws_database是自定义域名,需保证容器DNS能正常解析该域名,可临时替换为MySQL实例公网IP进行测试。
2. 调整MySQL连接参数
本地网络延迟低,容器内可能因网络波动触发超时,修改连接参数增加容错性:
db = mysql.connector.connect( host = "aws_database", user = "new_master_user", passwd = "***********", port = "3306", database = "testdb", connection_timeout=30, # 延长连接超时时间 max_allowed_packet=1024*1024*100 # 增大允许的数据包尺寸,避免大查询中断 )
3. 检查MySQL服务器超时配置
AWS MySQL实例的wait_timeout或interactive_timeout设置过短,可能导致容器连接在执行查询前被断开:
- 登录MySQL执行命令查看参数:
SHOW VARIABLES LIKE 'wait_timeout'; SHOW VARIABLES LIKE 'interactive_timeout'; - 若值过小,通过AWS控制台修改数据库参数组,增大这两个参数的数值。
4. 切换Docker网络模式
默认桥接网络可能存在访问限制,尝试使用宿主机网络模式运行容器:
docker run --network host <你的镜像名称>
注意:使用host模式时,容器端口会直接复用宿主机端口,需避免端口冲突。
5. 统一依赖包版本
本地与容器内的mysql-connector-python版本不一致可能引发兼容性问题:
- 查看本地依赖版本:
pip show mysql-connector-python - 在
requirements.txt中指定与本地一致的版本,例如:mysql-connector-python==8.0.33
之后重新构建Docker镜像。
内容的提问来源于stack exchange,提问作者Patrick B
相关产品推荐
相关产品推荐

