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

Docker-Compose中Django无法连接PostgreSQL或Celery的问题

Docker网络端口映射与Django/Celery数据库连接问题解决

问题根源拆解

  1. 端口映射逻辑混淆:设置SQL_PORT=5000时,Django尝试连接db:5000,但PostgreSQL容器内部实际监听的是默认的5432端口。ports: 5000:5432仅用于将宿主机的5000端口映射到容器内部的5432,容器之间通信完全不需要用到这个宿主机映射端口。
  2. 环境变量配置缺失:把SQL_PORT改成5432后Django能启动,但Celery和app_test服务未配置任何数据库相关环境变量,它们完全不知道数据库的连接信息,自然无法建立连接。

具体解决方案

1. 统一容器内数据库连接参数

所有需要访问数据库的服务(app、celery-worker、app_test)都要配置一致的数据库环境变量,并且必须使用容器内部的5432端口,与宿主机的5000映射端口无关。

2. 修改docker-compose.yml配置

更新后的配置补全了celery-worker和app_test的数据库环境变量,确保所有服务能正确获取数据库连接信息:

version: "3.9"
   
services:
  app:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    container_name: app
    environment:
      - DEBUG=True
      - PYTHONUNBUFFERED=1
      - CELERY_BROKER=redis://broker:6379/0
      - CELERY_BACKEND=redis://broker:6379/   
      - APP_BASIC_AUTH_PASSWORD=adPswd12*
      - APP_BASIC_AUTH_USER=admin
      - APP_TOKEN_AUTH=NHEC_UTILITY
      - VTN_API_URL=vtn_app:8000
      - VTN_API_TOKEN=NHECAPP_UTILITY
      # 数据库连接参数,使用容器内部端口
      - SQL_HOST=db
      - SQL_PORT=5432
      - SQL_DATABASE=nhec
      - SQL_USER=nhec
      - SQL_PASSWORD=nhec
    volumes:
      - .:/code
    ports:
      - "9000:8000"
    networks:
      - app-web-net  
    depends_on:
      - db
      - broker
  app_test:
    build: .
    command: python manage.py test
    container_name: app_test
    environment:
      - DEBUG=True
      - PYTHONUNBUFFERED=1
      # 补全测试服务的数据库连接参数
      - SQL_HOST=db
      - SQL_PORT=5432
      - SQL_DATABASE=nhec
      - SQL_USER=nhec
      - SQL_PASSWORD=nhec
    volumes:
      - .:/code
    depends_on:
      - db
  db:
    image: postgres:10
    container_name: app_postgres
    ports:
      - 5000:5432  # 此映射仅给宿主机使用,容器间通信无需依赖
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: nhec
      POSTGRES_USER: nhec
      POSTGRES_PASSWORD: nhec
    networks:
      - app-web-net
  celery-worker:
    build: .
    command: celery -A app worker -l DEBUG
    depends_on:
      - db
      - broker
    environment:
      CELERY_BROKER_URL: redis://broker:6379/0
      # 补全Celery的数据库连接参数
      - SQL_HOST=db
      - SQL_PORT=5432
      - SQL_DATABASE=nhec
      - SQL_USER=nhec
      - SQL_PASSWORD=nhec
    networks:
      - app-web-net
  broker:
    image: redis:6-alpine
    ports:
      - 6379:6379
    networks:
      - app-web-net

volumes: 
  db_data: {}

networks: 
  app-web-net:
    driver: bridge

3. 配置Django读取环境变量

在Django的settings.py中,数据库配置需从环境变量取值,确保与docker-compose的配置一致:

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('SQL_DATABASE'),
        'USER': os.getenv('SQL_USER'),
        'PASSWORD': os.getenv('SQL_PASSWORD'),
        'HOST': os.getenv('SQL_HOST'),
        'PORT': os.getenv('SQL_PORT'),
    }
}

4. 验证连接有效性

  • 重启所有服务:执行docker-compose down && docker-compose up -d
  • 测试Celery连接:进入Celery容器执行docker exec -it celery-worker python manage.py shell,接着运行from django.db import connection; connection.ensure_connection(),无报错则连接正常。
  • 测试测试服务:直接查看app_test日志,或手动执行docker-compose run app_test查看测试结果。

内容的提问来源于stack exchange,提问作者Kyle Calica-St

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:15:31