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

Docker Compose部署Django无法连接MySQL容器报连接拒绝错误

故障根因

Docker Compose 部署的每个服务都拥有独立的网络命名空间,容器内的127.0.0.1仅指向当前容器自身的回环地址,无法访问其他容器或宿主机上的服务。
你当前Django配置中把MySQL地址写为127.0.0.1,等价于在运行Django的web容器内部找3306端口的MySQL服务,但web容器本身没有部署MySQL,自然触发Connection refused错误。宿主机上MySQL Workbench能正常连接,是因为你在compose配置中把MySQL容器的3306端口映射到了宿主机,Workbench访问的是宿主机暴露的端口,和容器间内部通信走的不是同一条链路,不代表容器间网络连通。

修复步骤
  • 修改Django项目的settings.py数据库配置,将HOST字段的值从127.0.0.1改为compose中定义的MySQL服务名database。Docker Compose默认会为同一自定义网络下的服务提供内置DNS解析,服务名可直接作为内部通信的域名使用,修改后的配置如下:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 's_db',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'database',
        'PORT': '3306',
    }
}
  • 调整docker-compose.yaml配置,补全健康检查、自动建库、自定义网络配置,解决depends_on仅控制容器启动顺序、不等待MySQL服务就绪的问题,修改后配置如下:
version: '3.8'

services:
  web:
    image: s-compose:latest
    ports:
      - 8000:8000
    command: >
      sh -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - ./s:/home/app/webapp
    depends_on:
      database:
        condition: service_healthy
    networks:
      - app-network

  database:
    image: mysql:5.7-debian
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: s_db
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"]
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

注:配置中新增的MYSQL_DATABASE: s_db环境变量会让MySQL容器首次启动时自动创建你项目需要的s_db库,无需手动进入容器建库;健康检查配置会等到MySQL真正完成初始化、可响应连接请求后,再启动web容器,避免服务启动顺序差导致的连接失败。

  • 调整Dockerfile中的依赖安装逻辑,你当前写的RUN pip install -r req.txt; exit 0会强制忽略依赖安装的所有错误,若mysqlclient等数据库驱动安装失败,后续也会触发数据库相关异常,建议将该行修改为RUN pip install -r req.txt,如果出现依赖安装报错单独排查解决,不要强制跳过。
  • 清理旧容器、重新构建并启动服务,执行以下命令:
docker-compose down
docker-compose up --build -d
连通性验证

服务启动后,可直接进入web容器执行Django数据库命令验证:

docker-compose exec web sh
python manage.py showmigrations

若命令正常输出迁移记录、无连接报错,说明故障已修复。

内容的提问来源于stack exchange,提问作者Remus Case

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:42:18