为什么 PHP docker 容器无法查找 MYSQL 容器的主机名?



我已经创建并链接了php-apache容器和MYSQL容器。但是当我尝试使用php文件中的PDO建立连接时,我得到了错误。有人知道怎么解决吗?谢谢

PDO错误:

致命错误:未捕获的PDO异常:PDO::__construct((:php_network_getaddresses:getaddrinfo失败:名称或服务在/var/www/html/index.php:3堆栈跟踪:#0/var/www/html/index.php/var/www/html/index.php:3堆栈跟踪:#0/var/www/htl/index.php(3(:PDO->__construct('mysql:host=mysq…','root','root'(#1{main}在第3行的/var/www/html/index.php中抛出

我的目录结构:

.
├── mysql
├── php
|   └── Dockerfile
├── src
|   └── index.php
└── docker-compose.yml

我的index.php:的内容

$connection = new PDO('mysql:host=mysql-db,dbname=app', 'root', 'root');

PHP Dockerfile:

FROM php:7.3.3-apache
RUN docker-php-ext-install -j$(nproc) pdo_mysql

docker-compose.yml:

version: '3'
services:
apache-php:
build:
./php
volumes:
- ./src:/var/www/html
ports:
- "8080:80"
depends_on:
- mysql-db
links:
- mysql-db
mysql-db:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- /mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app

首先,您不需要将自动完成的links:,因为两个服务都在同一网络中。

其次,depends_on不会等到MySQL服务器启动并运行,并且PHP服务可能在准备好之前就开始通信,这就是您收到此错误的原因。

在这种情况下,IT最好为您的PHP服务实现"等待"功能。

为此,您需要为您的PHP服务和类似的代码添加一个入口点

docker文件

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

码头入口点.sh

#!/bin/sh -e
until nc -vz mysql-db:3306 > /dev/null; do
>&2 echo "mysql-db:3306 is unavailable - sleeping"
sleep 2
done
>&2 echo "mysql-db is up"
exec "YOUR COMMAND"
exit 0

我在做这件事时遇到了两个问题:

1( php:apache镜像需要大量的工作来运行php应用程序,最好只是自己制作,我从ubuntu 18:04镜像中做了我的

2( 我不记得为什么了,但mysql需要设置为允许mysql_native_passwords才能使用(在我的情况下(php

这是我在课堂上为一个测试所做的docker compose文件(因此标记为examen(,用于共享我的网络应用程序:

version: '3'
services:
app:
image: gnomejodas/httpd-php:examen
ports:
- 80:80
volumes:
- ./src:/var/www/html
links:
- db
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./db:/var/lib/mysql

PD。我是一个超级新手开发人员(仍在学习(,请对我宽容一点。

编辑。如果您制作自己的映像,请不要忘记CMD apachectl -D FOREGROUND,这样您的apache服务就会在运行容器时启动。

毕竟,在我的php代码中,主机定义后面有一个逗号,而不是分号。我向你道歉。

最新更新