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

