Docker部署Django项目:自定义网络连接本地PostgreSQL问题
解决Docker容器通过自定义网络连接本地PostgreSQL的问题
要通过自定义网络让Docker容器连接本地PostgreSQL,需要从PostgreSQL配置、Docker Compose设置、Django数据库配置三个方面调整:
1. 修改PostgreSQL监听与访问权限
PostgreSQL默认仅监听localhost,需调整配置允许Docker容器所在网络访问:
- 编辑
postgresql.conf(路径通常为/etc/postgresql/{版本号}/main/postgresql.conf),将listen_addresses改为'0.0.0.0'(生产环境建议指定具体Docker网关IP,避免全开放),保存后退出。 - 编辑同目录下的
pg_hba.conf,添加一行允许Docker自定义网络IP段的访问规则:
(可通过host all all 172.18.0.0/16 scram-sha-256docker network inspect backend查看自定义网络的实际网段,替换上述IP段) - 重启PostgreSQL服务使配置生效:
sudo systemctl restart postgresql
2. 优化Docker Compose配置
无需硬编码宿主机IP,Docker提供跨平台通用的宿主机域名host.docker.internal,同时确保Django服务绑定容器内所有IP:
version: '3.3' services: web: restart: always container_name: main command: - /bin/bash - -c - | python manage.py makemigrations accounts python manage.py migrate python manage.py runserver 0.0.0.0:8000 # 绑定0.0.0.0允许外部访问 image: main build: . volumes: - .:/main ports: - "8000:8000" networks: - backend networks: backend: volumes: static:
3. 调整Django数据库配置
在项目的settings.py中更新数据库连接的HOST为host.docker.internal:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '你的数据库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': 'host.docker.internal', 'PORT': '5432', } }
若坚持使用原配置中的extra_hosts(dbhost:172.17.0.1),只需确保PostgreSQL的pg_hba.conf允许172.17.0.1访问,同时将DATABASES的HOST设为dbhost即可。
内容的提问来源于stack exchange,提问作者Hom Prasad Dhakal
相关产品推荐
相关产品推荐

