Docker-Compose中Django无法连接PostgreSQL或Celery的问题
Docker网络端口映射与Django/Celery数据库连接问题解决
问题根源拆解
- 端口映射逻辑混淆:设置
SQL_PORT=5000时,Django尝试连接db:5000,但PostgreSQL容器内部实际监听的是默认的5432端口。ports: 5000:5432仅用于将宿主机的5000端口映射到容器内部的5432,容器之间通信完全不需要用到这个宿主机映射端口。 - 环境变量配置缺失:把
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
相关产品推荐
相关产品推荐

