在单个AWS ECS Fargate任务定义中连接Django与MySQL容器
解决Django在ECS Fargate中连接MySQL容器的localhost问题
问题根源
你遇到的MySQLdb.OperationalError: (2002, "Can't connect to local server through socket '/run/mysqld/mysqld.sock' (2)")错误,本质是Django默认使用Unix套接字连接localhost的MySQL,但你的MySQL容器并没有在共享文件系统上暴露这个套接字。即使在同一个ECS任务的awsvpc网络下,容器间的文件系统是完全隔离的,因此无法通过套接字实现通信。
解决方案
1. 强制Django使用TCP/IP连接
在Django的数据库配置中显式指定PORT参数(MySQL默认端口为3306),确保HOST设为localhost后,Django会自动切换为TCP/IP连接模式,而非尝试套接字连接:
# settings.py 中的数据库配置段 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.getenv('DB_NAME'), 'USER': os.getenv('DB_USER'), 'PASSWORD': os.getenv('DB_PASSWORD'), 'HOST': os.getenv('DB_HOST', 'localhost'), 'PORT': os.getenv('DB_PORT', '3306'), # 显式指定端口触发TCP/IP连接 } }
同时确认.env文件中DB_PORT的值设置为3306。
2. 校验ECS任务容器配置
- 确保MySQL容器在任务定义中已暴露3306端口,Django容器无需额外映射主机端口——同一ECS任务内的容器在awsvpc模式下可直接通过localhost+端口互通。
- 确认两个容器属于同一个ECS任务:awsvpc模式下,只有同一任务内的容器共享网络命名空间,跨任务的容器无法通过localhost通信。
3. 确认MySQL容器的监听配置
检查MySQL容器是否启用了TCP/IP监听(默认开启),无需额外修改my.cnf或启动命令,官方MySQL镜像默认会监听0.0.0.0:3306,允许同网络内的容器连接。
额外排查步骤
- 查看ECS任务日志,确认MySQL容器是否正常启动,是否有
Listening on TCP/IP port 3306类的日志输出。 - 在Django容器中执行
telnet localhost 3306或nc -zv localhost 3306测试端口连通性,快速验证网络链路是否正常。
内容的提问来源于stack exchange,提问作者UCFChandra
相关产品推荐
相关产品推荐

