Docker容器无法连接MySQL问题求助
问题排查与解决
核心问题分析
- 你的
backend、celery等服务启用了network_mode: "host",但mysql服务未配置该模式——此时这些服务里的127.0.0.1指向容器自身的localhost,而非宿主机或mysql容器的网络地址,导致无法连接。 depends_on仅保证服务启动顺序,不确保mysql完成初始化就绪,可能出现backend启动时mysql还未准备好接受连接的情况。
方案一:使用Docker自定义网络(推荐,保持容器隔离性)
放弃host模式,通过Docker默认的自定义网络,让服务间以服务名互相访问:
修改docker-compose.yaml文件:
version: "3.8" services: redis: image: redis:5-alpine restart: always env_file: .env backend: build: dockerfile: Dockerfile context: . restart: always env_file: .env ports: - "8000:8000" depends_on: - redis - mysql celery: build: dockerfile: Dockerfile context: . env_file: .env restart: always command: celery -A labb worker -l info -Q default,high_priority,celery_periodic depends_on: - backend - mysql celery-beat: build: dockerfile: Dockerfile context: . env_file: .env restart: always command: celery -A labb beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler --pidfile /tmp/celerybeat.pid depends_on: - backend - mysql mysql: image: mysql:latest env_file: .env ports: - "3306:3306" restart: always # 健康检查:确保mysql就绪后才允许其他服务连接 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${MYSQL_USER}", "-p${MYSQL_PASSWORD}"] interval: 5s timeout: 5s retries: 5
同时修改你的数据库连接配置(比如Django的settings.py):
将数据库HOST从127.0.0.1改为mysql(对应docker-compose中的mysql服务名)。
方案二:让mysql也使用host模式(不推荐,破坏容器隔离性)
若坚持使用host模式,给mysql服务也添加network_mode: "host",并确保mysql就绪后再启动其他服务:
修改mysql服务段:
mysql: image: mysql:latest env_file: .env ports: - "3306:3306" network_mode: "host" restart: always healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${MYSQL_USER}", "-p${MYSQL_PASSWORD}"] interval: 5s timeout: 5s retries: 5
同时确保.env文件包含正确的mysql环境变量:
MYSQL_ROOT_PASSWORD=你的root密码 MYSQL_DATABASE=你的数据库名 MYSQL_USER=你的数据库用户 MYSQL_PASSWORD=你的数据库密码
额外验证步骤
如果修改后仍有问题,可先单独启动mysql服务,确认其就绪后再启动其他服务:
docker-compose up -d mysql # 查看日志确认mysql就绪:等待出现 "ready for connections" 字样 docker-compose logs mysql # 启动其他服务 docker-compose up -d backend celery celery-beat
内容的提问来源于stack exchange,提问作者Khushal9
相关产品推荐
相关产品推荐

