Docker是否自动包含PostgreSQL?Django项目镜像构建配置求助
Django + PostgreSQL Docker部署配置方案
错误原因分析
Is the server running on that host and accepting TCP/IP connections?
2023-07-18 18:22:33 connection to server at "localhost" (::1), port 5432 failed: Cannot assign requested address
核心问题:Docker容器内的localhost指向容器自身,你的Django服务尝试连接容器内的PostgreSQL,但实际数据库并未在该容器中运行,也未与Web容器处于同一网络,导致连接失败。
正确思路是用Docker Compose将Web服务和PostgreSQL服务分离部署,通过容器网络实现互通,而非将数据库打包进Web镜像。
配置修改步骤
1. 完善docker-compose.yml,添加PostgreSQL服务
替换原文件内容,新增数据库服务、网络和数据持久化配置:
services: web: build: context: app ports: - '8000:8000' depends_on: - db environment: - DB_NAME=postgres - DB_USER=postgres - DB_PASSWORD=postgres - DB_HOST=db - DB_PORT=5432 networks: - app-network db: image: postgres:15 environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres volumes: - postgres_data:/var/lib/postgresql/data/ networks: - app-network volumes: postgres_data: networks: app-network: driver: bridge
配置说明:
depends_on:确保Web服务在数据库启动后再启动networks:让两个服务处于同一自定义网络,Web服务可通过db(服务名)直接访问数据库volumes:持久化PostgreSQL数据,避免容器重启后数据丢失- 环境变量:传递数据库连接参数给Django,同时初始化PostgreSQL账号
2. 调整Django的settings.py数据库配置
修改数据库连接逻辑,读取容器环境变量:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': os.environ.get('DB_HOST'), 'PORT': os.environ.get('DB_PORT'), } }
注意:需确保requirements.txt中包含psycopg2-binary或psycopg2(PostgreSQL Python驱动)。
3. 优化Dockerfile(可选)
原Dockerfile无需大改,若使用psycopg2而非psycopg2-binary,需添加系统依赖:
FROM python:3 ENV PYTHONUNBUFFERED=1 WORKDIR /code # 安装PostgreSQL编译依赖(仅当使用psycopg2时需要) RUN apt-get update && apt-get install -y libpq-dev gcc COPY requirements.txt . RUN pip install -r requirements.txt COPY . . ENV PORT=8000 EXPOSE 8000 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
启动与初始化
- 确保
requirements.txt包含必要依赖:
django>=4.2 psycopg2-binary>=2.9.7
- 构建并启动服务:
docker-compose up --build
- 首次启动需执行数据库迁移:
docker-compose exec web python manage.py migrate
内容的提问来源于stack exchange,提问作者alecnazzy
相关产品推荐
相关产品推荐

