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
相关产品推荐
相关产品推荐

