[英]Can't connect to local MariaDB running with Docker with PHP PDO
我有一個本地 Docker 組合堆棧,其中包含 MariaDB、PHP-FPM 和 Nginx 在我的機器上運行以進行本地開發。 我可以在我的瀏覽器上成功訪問 Nginx 在 http://localhost:8080/ 上提供的網頁。 我還可以在主機 127.0.0.1、端口 8889 上使用本地 GUI DB 瀏覽器 TablePlus 成功連接到數據庫。它使用用戶root
和密碼root
(但奇怪的是沒有任何其他用戶設置為 MYSQL_USER,MYSQL_PASSWORD env我在 Docker 中捕獲的變量組成)。
無論如何,當我嘗試使用以下 PHP 代碼連接 PHP/PDO 時,相同的憑據:
$db = new PDO('mysql:host=localhost;port=8889;dbname=words', 'root', 'root');
...我收到Error: SQLSTATE[HY000] [2002] No such file or directory
編輯:當我使用時:
$db = new PDO('mysql:host=127.0.0.1;port=8889;dbname=words', 'root', 'root');
...我收到Error: SQLSTATE[HY000] [2002] Connection refused
為什么?
(這是我的 Docker 撰寫文件:
version: "3"
services:
mariadb:
image: mariadb:10.5
container_name: mariadb-10.5
restart: unless-stopped
ports:
# port 3306 is the default port for mariadb, forwarded to 8889 on the local machine
- 8889:3306
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
php-fpm:
image: bitnami/php-fpm:7.4
container_name: phpfpm-7.4
restart: unless-stopped
ports:
- 9000:9000
volumes:
- ${WWW_DOCUMENT_ROOT}:/app
nginx:
image: bitnami/nginx:1.20
container_name: nginx-1.20
restart: always
ports:
- 8080:8080
volumes:
- ./nginx/logs:/opt/bitnami/nginx/logs/
- ./nginx/server-blocks/default.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro
- ${WWW_DOCUMENT_ROOT}:/app
depends_on:
- mariadb
- php-fpm
)
正如@danblack所回答的那樣,由於與數據庫的連接是從 Docker 容器內部到另一個容器完成的:
容器之間的連接始終使用未重新映射的端口。 因此,與 DB 容器的連接需要使用內部 MariaDB 標准端口 3306——而不是重新映射的暴露的 8889 端口。
數據庫的主機名必須是數據庫容器名稱(在本例中為 MariaDB 容器名稱mariadb-10.5
),而不是127.0.0.1
或localhost
。
因此,總而言之,PHP/PDO 連接 object 變為:
$db = new PDO('mysql:host=mariadb-10.5;dbname=words', 'root', 'root');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.