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

Docker环境下Laravel应用无法访问容器内PostgreSQL数据库问题咨询

问题排查与解决方案

1. PostgreSQL服务未加入自定义网络

你在docker-compose中为app、nginx服务指定了自定义网桥mynet,但db服务未配置所属网络,默认会加入docker全局默认网桥,两个不同网桥的容器无法直接通信,这是核心问题。
修复方案:在db服务的配置块下添加网络配置:

db:
  image: postgres
  restart: always
  tty: true
  ports:
    - "5432:5432"
  environment:
    POSTGRES_USER: root
    POSTGRES_DB: app
    POSTGRES_PASSWORD: password
    PGDATA: /var/lib/postgresql/data/pgdata
    POSTGRES_HOST_AUTH_METHOD: trust
  volumes:
    - mysqldata:/var/lib/postgresql/data
  # 新增以下两行
  networks:
    - mynet

2. 数据库主机地址配置错误

不要写死容器IP,Docker Compose同网络下的服务可以直接用服务名作为DNS域名解析,写死IP会因为容器重启、重建后IP变动导致连接失败,且你当前配置的固定IP本身就存在失效风险。
修复方案:修改.env中的DB_HOST配置:

DB_HOST=db

3. Laravel配置缓存导致配置未生效

错误日志显示服务尝试连接127.0.0.1的数据库,和你.env中配置的IP不符,说明Laravel读取的是旧的缓存配置,没有加载最新的.env变量。
修复方案:进入app容器执行以下命令清除配置缓存:

docker exec -it myapp php artisan config:clear

4. 容器挂载覆盖了构建时拷贝的配置

你在app服务中配置了本地项目目录挂载到容器的/var/www/html,Dockerfile构建阶段COPY的.env文件会被你本地的.env文件直接覆盖,所以修改配置直接改本地的.env文件即可,不需要修改容器内的文件。

额外注意(不影响数据库连接,但会导致站点访问异常)

你的nginx配置中fastcgi_pass写的是php:9000,但你的PHP服务名是app,会导致站点访问时nginx无法转发请求到PHP,需要修改为:

fastcgi_pass app:9000;

所有配置修改完成后,重启所有容器生效:

docker-compose down && docker-compose up -d

之后再进入app容器执行数据库迁移即可正常连接PostgreSQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:27:02