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

Docker化简单Django应用时遇PostgreSQL连接错误,求解决

Django Docker化数据库连接失败问题分析与修复方案

问题原因

你的Django应用配置的数据库连接地址是localhost:5432,但Docker容器是独立的网络环境:

  • 容器内的localhost指向容器自身,而你的容器仅安装了Python和Django依赖,没有运行PostgreSQL服务
  • 即便宿主机运行了PostgreSQL,容器默认也无法通过localhost直接访问宿主机服务

修复方案

方案一:使用Docker Compose部署Django+PostgreSQL(推荐)

该方案让Django和PostgreSQL在同一Docker网络中,互相可直接访问,适合开发和生产环境:

  1. 在项目根目录创建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:
  1. 修改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',
    }
}
  1. 启动服务:
docker-compose up --build

启动后,Django会自动连接到db服务(PostgreSQL容器),无需额外配置端口转发或IP。


方案二:连接宿主机的PostgreSQL(仅开发测试用)

如果你的PostgreSQL已经在宿主机运行,可通过以下步骤让容器访问:

  1. 获取宿主机在Docker网络中的IP:

    • Linux/macOS:执行ip addr show docker0,找到类似172.17.0.1的地址
    • Windows:执行ipconfig,找到DockerNAT的IP地址
  2. 修改Djangosettings.py的数据库配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': '你的数据库名',
        'USER': '数据库用户名',
        'PASSWORD': '数据库密码',
        'HOST': '172.17.0.1', # 替换为你的宿主机Docker网络IP
        'PORT': '5432',
    }
}
  1. 允许PostgreSQL接受外部连接:

    • 修改postgresql.conf,设置listen_addresses = '*'
    • 修改pg_hba.conf,添加一行host all all 0.0.0.0/0 md5
    • 重启PostgreSQL服务
  2. 重新构建并运行容器:

docker build -t app .
docker run -p 8888:80 app

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:54:52