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

Docker容器无法连接MySQL问题求助

问题排查与解决

核心问题分析

  1. 你的backend、celery等服务启用了network_mode: "host",但mysql服务未配置该模式——此时这些服务里的127.0.0.1指向容器自身的localhost,而非宿主机或mysql容器的网络地址,导致无法连接。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:10:33