尝试从php:最新映像(没有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
我在这里找到了关于stackoverflow的+20解决方案,但是没有一个能够解决我的问题。我可以使用以下凭据使用mysql workbench或DataGrid毫无问题地进行连接:
服务器:localhost用户: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:
我的conn.php:
<?php
$db = new PDO('mysql:host=database;dbname=testdb', 'root', '12345678');
直到现在我还是尝试解决此问题:
PS:我在Mac上使用docker
经过5个小时的研究,我真的不知道该怎么办,并且由于我不是Docker专家,所以希望能为我指出修复的方向。
谢谢!
答案 0 :(得分:1)
能够找到解决方案。事实证明,在启动php脚本之前,我需要等待mysql服务可用。因此,我使用了wait-for-it解决方案,并在docker-compose上进行了此操作:
command: >
bash -c "chmod +x /docker/./wait-for-it.sh
&& /docker/./wait-for-it.sh database:3306 -- echo 'database is up'
&& php phpscript.php"
感谢您的帮助
答案 1 :(得分:0)
在您的情况下,您无法通过localhost
或127.0.0.1
连接到mysql。如果您这样连接。它调用localhost inside
php容器。但是您的php容器中没有安装mysql。
您必须通过容器名称进行连接。或docker inspect
您的mysql容器并获得容器IP
。例如,使用docker-compose
database:
container_name: mysql
现在,您的mysql数据库主机为mysql
-容器名称为localhost