Docker化简单Django应用时遇PostgreSQL连接错误,求解决
Django Docker化数据库连接失败问题分析与修复方案
问题原因
你的Django应用配置的数据库连接地址是localhost:5432,但Docker容器是独立的网络环境:
- 容器内的
localhost指向容器自身,而你的容器仅安装了Python和Django依赖,没有运行PostgreSQL服务 - 即便宿主机运行了PostgreSQL,容器默认也无法通过
localhost直接访问宿主机服务
修复方案
方案一:使用Docker Compose部署Django+PostgreSQL(推荐)
该方案让Django和PostgreSQL在同一Docker网络中,互相可直接访问,适合开发和生产环境:
- 在项目根目录创建
docker-compose.yml文件:
version: '3.8' services: db: image: postgres:13-alpine environment: POSTGRES_USER: django_user POSTGRES_PASSWORD: django_pass POSTGRES_DB: django_db volumes: - postgres_data:/var/lib/postgresql/data/ ports: - "5432:5432" web: build: . command: python manage.py runserver 0.0.0.0:80 volumes: - .:/app ports: - "8888:80" depends_on: - db environment: - DB_HOST=db - DB_USER=django_user - DB_PASSWORD=django_pass - DB_NAME=django_db volumes: postgres_data:
- 修改Django项目的
settings.py,从环境变量读取数据库配置:
import os # ... 其他配置 ... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': os.environ.get('DB_HOST', 'localhost'), 'PORT': '5432', } }
- 启动服务:
docker-compose up --build
启动后,Django会自动连接到db服务(PostgreSQL容器),无需额外配置端口转发或IP。
方案二:连接宿主机的PostgreSQL(仅开发测试用)
如果你的PostgreSQL已经在宿主机运行,可通过以下步骤让容器访问:
获取宿主机在Docker网络中的IP:
- Linux/macOS:执行
ip addr show docker0,找到类似172.17.0.1的地址 - Windows:执行
ipconfig,找到DockerNAT的IP地址
- Linux/macOS:执行
修改Django
settings.py的数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '你的数据库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '172.17.0.1', # 替换为你的宿主机Docker网络IP 'PORT': '5432', } }
允许PostgreSQL接受外部连接:
- 修改
postgresql.conf,设置listen_addresses = '*' - 修改
pg_hba.conf,添加一行host all all 0.0.0.0/0 md5 - 重启PostgreSQL服务
- 修改
重新构建并运行容器:
docker build -t app . docker run -p 8888:80 app
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

