Docker环境下Nextcloud连接PostgreSQL遇未知主机及内部错误求助
问题分析与解决方案
核心问题
你遇到的数据库无法识别问题,根源在于所有服务都指定了network_mode: bridge:
- Docker默认的bridge网络不支持容器间通过服务名(如
db)解析通信,只能用容器IP,导致Nextcloud配置的POSTGRES_HOST=db无法找到PostgreSQL容器。 - 后续修改为
172.17.0.1:5432时,PostgreSQL默认仅监听容器内部IP,拒绝来自宿主机网关的外部连接,因此触发内部错误。
修复步骤
1. 调整Docker Compose配置
移除所有服务的network_mode: bridge,让Compose自动创建专属自定义网络(容器间可直接用服务名通信),调整后的配置如下:
version: '3' services: db: image: postgres:alpine hostname: db restart: always volumes: - /var/lib/docker/volumes/nextcloud/postgres:/var/lib/postgresql/data environment: - POSTGRES_DB=nextcloud_db - POSTGRES_USER=nextcloud - POSTGRES_PASSWORD=admin redis: image: redis:alpine restart: always app: image: nextcloud:apache restart: always ports: - 172.17.0.1:8080:80 volumes: - /var/lib/docker/volumes/nextcloud/nextcloud:/var/www/html environment: - POSTGRES_HOST=db - POSTGRES_DB=nextcloud_db - POSTGRES_USER=nextcloud - POSTGRES_PASSWORD=admin - REDIS_HOST=redis depends_on: - db - redis
- 无需给PostgreSQL映射宿主机端口(除非你需要从宿主机外部直接连接数据库),自定义网络内容器可直接通过服务名
db通信。
2. 重新部署服务
执行以下命令清理旧容器并启动新配置:
# 停止并移除当前运行的容器和网络 docker-compose down # 后台启动新服务 docker-compose up -d
3. 验证通信(可选)
部署完成后,可进入Nextcloud容器测试数据库连接:
# 进入Nextcloud容器(替换<容器名>为实际容器名称) docker exec -it <容器名> bash # 安装PostgreSQL客户端 apt update && apt install -y postgresql-client # 测试数据库连接 psql -h db -U nextcloud -d nextcloud_db
输入密码admin后能正常进入数据库,说明通信配置正常。
内容的提问来源于stack exchange,提问作者Cedric
相关产品推荐
相关产品推荐

