![](/img/trans.png)
[英]Cannot not connect to database server within docker-compose (php and MariaDB)
[英]Cannot connect to postgresql via php pdo on docker-compose
我無法通過 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。 這是我的 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 放在其中是一個更好的解決方案。 一旦您使用硬編碼值,您就可以做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.