无法通过 docker-compose 上的 php pdo 连接到 postgresql



我无法通过PDO将我的php应用程序连接到postgresql。我有一个经典的错误:

SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?

但是我可以使用DBeaver连接到我的数据库,例如通过我用于PDO的相同配置(相同的主机,相同的端口,相同的用户和相同的密码!(,并且我可以看到postgresql与netstat

命令的连接。我通过docker-compose使用docker。这是我的码头工人-compose.yml:

version: '3'
services:
nginx:
image: nginx:stable-alpine
container_name: nginx
depends_on:
- php
volumes:
- "${WWW_DIR}:/usr/share/nginx/html:ro"
- "${NGINX_LOG}:/var/log/nginx"
- "${NGINX_DIR}/nginx.conf:/etc/nginx/nginx.conf:ro"
ports:
- "127.0.0.1:8000:80"
php:
build: ${PHP_DIR}
container_name: php
depends_on:
- pgsql
- composer
volumes:
- "${PHP_LOG}/access.log:/var/log/access.log"
- "${PHP_LOG}/error.log:/var/log/error.log"
- "${WWW_DIR}:/var/www/html"
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
composer:
restart: 'no'
image: composer
command: install
volumes:
- "${WWW_DIR}:/app"
pgsql:
restart: always
build: ${PGSQL_DIR}
container_name: pgsql
volumes:
- "${PGSQL_DIR}/db:/var/lib/postgresql/data"
- "${PGSQL_LOG}:${POSTGRES_INITDB_WALDIR}:z"
ports:
- "127.0.0.1:5432:5432"
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_INITDB_WALDIR=${POSTGRES_INITDB_WALDIR}

这是我的 .env 文件:

# DIRs
WWW_DIR=../html
PHP_DIR=./php
NGINX_DIR=./nginx
PGSQL_DIR=./pgsql
# LOGs
NGINX_LOG=./nginx/log
PHP_LOG=./php/log
PGSQL_LOG=./pgsql/log
POSTGRES_INITDB_WALDIR=/var/log/pgsql
# DB
POSTGRES_USER=site
POSTGRES_PASSWORD=etis
POSTGRES_DB=dbname

这是我的 Postgresql 的 Dockerfile:

FROM postgres:alpine
# DB import
COPY db.sql /docker-entrypoint-initdb.d/

所以我错了什么?

提前谢谢。

您的应用程序在容器内运行,当它尝试连接到 127.0.0.1 时,它希望数据库服务器在同一容器中运行。事实并非如此。您的数据库在容器/服务pgsql中运行。

当您在主机上运行应用程序时,它可以工作,因为所有内容都在同一台计算机上运行。此外,您的数据库客户端也可以工作,因为您在主机上映射了相同的端口。

溶液:

将对应用程序中数据库服务器的引用更改为指向pgsql而不是127.0.0.1。要在主机上也使用相同的工作,您也可以将映射添加到/etc/hosts(或 Windows 的等效映射(。由于您使用环境文件,因此将数据库 URL 放入其中是更好的解决方案。一旦你让它使用硬编码值,就可以这样做。

最新更新