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

Docker容器化Django应用连接本地PostgreSQL数据库失败求助

解决Docker容器内Django连接本地PostgreSQL失败的问题

核心原因

容器内的127.0.0.1指向容器自身网络栈,而非宿主机,直接用这个地址必然无法访问宿主机上的PostgreSQL。以下是针对性解决步骤:

1. 确保PostgreSQL监听外部地址

编辑PostgreSQL配置文件/etc/postgresql/14/main/postgresql.conf(路径随版本可能略有差异):

listen_addresses = '*'  # 替换原有的127.0.0.1,允许所有地址监听

修改后重启PostgreSQL服务:

sudo systemctl restart postgresql

2. 允许Docker网段访问PostgreSQL

编辑/etc/postgresql/14/main/pg_hba.conf,添加Docker默认bridge网段的访问权限:

# 允许172.17.0.0/16网段(Docker默认bridge网段)的所有用户访问所有数据库
host    all             all             172.17.0.0/16            scram-sha-256

注:如果你的PostgreSQL认证方式是md5,将scram-sha-256替换为md5即可。修改后需重启PostgreSQL服务。

3. 正确配置DATABASE_HOST

方案一:使用host.docker.internal(推荐,Docker 20.10+支持)

修改docker-compose.yml,添加extra_hosts配置:

services:
  web:
    build: ./
    command: gunicorn main.wsgi:application --bind 0.0.0.0:8000
    ports:
      - 8000:8000
    env_file:
      - ./main/.env
    extra_hosts:
      - "host.docker.internal:host-gateway"  # 将宿主机映射为该域名

然后修改.env文件:

DATABASE_NAME=db_name
DATABASE_USER=db_user
DATABASE_PASSWORD=password
DATABASE_HOST=host.docker.internal
DATABASE_PORT=5433  # 替换为错误提示里的实际端口,不要留占位符port

方案二:使用宿主机的Docker网关IP

如果host.docker.internal无效,先查看Docker网关IP:

ip addr show docker0

通常输出中会显示类似inet 172.17.0.1/16的地址,这个172.17.0.1就是宿主机在Docker bridge网络中的网关IP。直接修改.env:

DATABASE_HOST=172.17.0.1

4. 开放宿主机防火墙端口

Ubuntu的ufw防火墙可能阻止了5433端口的访问,执行以下命令开放:

sudo ufw allow 5433/tcp

5. 验证连通性

进入容器内部测试PostgreSQL端口是否可达:

docker exec -it <你的容器名称> telnet host.docker.internal 5433
# 或者用网关IP测试
docker exec -it <你的容器名称> telnet 172.17.0.1 5433

如果连接成功,说明网络问题已解决,重启Django容器即可正常连接数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:30:07