尝试从 php:latest 图像(没有 apache 或 nginx)连接到 mysql 8 (mysql:latest),我收到了这个恼人的错误:
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused in /src/conn.php:5
Stack trace:
#0 /src/conn.php(5): PDO->__construct('mysql:host=data...', 'root', '12345678')
#1 {main}
thrown in /src/conn.php on line 5
Run Code Online (Sandbox Code Playgroud)
我在 stackoverflow 上寻找了超过 20 个解决方案,但没有一个能够解决我的问题。我可以使用以下凭据使用 mysql Workbench 或 DataGrid 进行连接,不会出现任何问题:
服务器:本地主机用户:root 通行证:12345678
但是我在 php 图像上使用的任何配置都无法使它们相互连接。
我的 docker-compose 文件:
version: '3'
services:
composer:
container_name: composer
networks:
- backend
image: composer
volumes:
- .:/app
command: install
database:
container_name: mysql
networks:
- backend
image: mysql:latest
volumes:
- ./database/mysqldata:/var/lib/mysql
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: 12345678
MYSQL_DATABASE: testdb
ports:
- "3306:3306"
php:
build:
context: .
container_name: php
networks:
- backend
image: php:apache
links:
- database
env_file:
- .env
volumes:
- .:/
command:
php /src/conn.php
depends_on:
- composer
- database
networks:
backend:
Run Code Online (Sandbox Code Playgroud)
我的 conn.php:
<?php
$db = new PDO('mysql:host=database;dbname=testdb', 'root', '12345678');
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的尝试解决这个问题:
PS:我使用的是 docker for mac
经过 5 个小时的研究,我真的不知道还能做什么,而且由于我不是 docker 专家,因此希望能得到任何帮助来指出修复的方向。
谢谢你!
在您的情况下,您无法通过localhost或连接到 mysql 127.0.0.1。如果你这样连接的话。它调用本地主机insidephp 容器。但是你的 php 容器中没有安装 mysql。
您必须通过容器名称进行连接。或者docker inspect你 mysql 容器并获取容器IP。例如,使用您的 docker-compose
database:
container_name: mysql
Run Code Online (Sandbox Code Playgroud)
现在你的 mysql 数据库主机是mysql- 容器名称localhost