Docker php DPO to MariaDB - Error: Could not find driver
Docker php DPO to MariaDB - Error: Could not find driver
我现在正在学习 PDO,我发现在我的 LEMP docker 堆栈(Nginx、php-fpm、MariaDB、phpMyadmin)中学习它更好Ubuntu18.04LTS。
这是我的 php 文件:
<?php
try {
$mydb = new PDO('mysql:host=database;dbname=mysql;charset=utf8', 'root', 'admin');
} catch (Exception $e) {
die('Error : ' . $e->getMessage());
}
?>
如您所见,我尝试在我的 php 代码中创建一个 PDO,以从我的数据库中恢复一些数据。
但每次我在浏览器(Firefox 69.0.2)上收到该消息时:
Error : could not find driver
我在这里看到 post:。这个问题和我的很相似,但它对我不起作用。
注意:php-fmp 和 Nginx 完美结合。 MariaDB 和 phpMyAdmin.
相同
这是我的 docker-compose.yml
文件:
version: "3"
services:
nginx:
image: tutum/nginx
ports:
- "7050:80"
links:
- phpfpm
volumes:
- ./nginx/default:/etc/nginx/sites-available/default
- ./nginx/default:/etc/nginx/sites-enabled/default
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
phpfpm:
image: php:fpm
links:
- database:mysql
ports:
- "7051:9000"
volumes:
- ./public:/usr/share/nginx/html
database:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: admin
ports:
- "7052:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
links:
- database:mysql
ports:
- "7053:80"
environment:
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: admin
PMA_ARBITRARY: 1
如果无需构建我自己的 Dockerfile 就可以解决这个问题,那就太好了。
但如果必须的话,我会的。这不是问题。
docker-compose 是 Dockerfile 的 "api" 类型。您需要在 Dockerfile
中添加这些库(apt-get 等...)
Dockerfile 是你的朋友!
你的PHP文件在一个docker容器或里面吗运行外面 docker,在主机里面?
如果它在 运行 内部 docker 容器中,它在哪个服务中?请注意 nginx
服务没有 "links" 配置,这意味着它只能通过 "database" 主机名访问数据库。还要检查 端口 (在此 post 的末尾)。
如果您的 PHP 文件在 运行 外部 ,那么您必须在连接字符串中使用 localhost 而不是 mysql,例如所以:'mysql:host=localhost;dbname=mysql;charset=utf8'
。这是因为 docker 的内部 DNS 就是:内部。您无法在 docker.
之外访问此主机名(数据库或 mysql)
同样重要的是,您的连接字符串未指定端口,在您的情况下为 7052。由于您要从 7052 重定向到 3306,我认为 3306 是 mysql 的默认端口,如果您不指定它,驱动程序会假定为 3306。明确说明主机和端口始终是个好主意。查看有关 PHP 数据库连接字符串的文档(因为我对 php 一无所知)。可能是 ...;port=7052
之类的。
此外,请阅读您正在使用的 docker-compose links
。它现在已被弃用,所以我建议不要在未来的项目中使用它,我什至建议花一些时间删除它。如果一切顺利,应该需要30秒到5分钟,而且它不会再困扰你了。
A 找到了解决方案。
首先,主机必须是 mysql
而不是我容器的名称(即 database
):
$mydb = new PDO('mysql:host=mysql;dbname=mysql;charset=utf8', 'root', 'admin');
在 phpfpm 容器内(可通过命令 docker-compose run --rm <container-name> bash
访问),我必须通过删除其开头的分号来启用配置文件 php.ini
中的 extension=php_pdo_msql
行行。
为了避免在 docker-compose up
之后每次都手动执行此操作,我将 docker-compose.yml
文件中的 phpfpm 服务替换为以下 Dockerfile
:
FROM php:fpm
RUN docker-php-ext-install pdo pdo_mysql
最后,只需使用命令 docker-compose build .
构建映像(将 .
替换为包含 docker-compose.yml
文件的目录的路径)。
它非常适合我。
我现在正在学习 PDO,我发现在我的 LEMP docker 堆栈(Nginx、php-fpm、MariaDB、phpMyadmin)中学习它更好Ubuntu18.04LTS。
这是我的 php 文件:
<?php
try {
$mydb = new PDO('mysql:host=database;dbname=mysql;charset=utf8', 'root', 'admin');
} catch (Exception $e) {
die('Error : ' . $e->getMessage());
}
?>
如您所见,我尝试在我的 php 代码中创建一个 PDO,以从我的数据库中恢复一些数据。
但每次我在浏览器(Firefox 69.0.2)上收到该消息时:
Error : could not find driver
我在这里看到 post:
注意:php-fmp 和 Nginx 完美结合。 MariaDB 和 phpMyAdmin.
相同这是我的 docker-compose.yml
文件:
version: "3"
services:
nginx:
image: tutum/nginx
ports:
- "7050:80"
links:
- phpfpm
volumes:
- ./nginx/default:/etc/nginx/sites-available/default
- ./nginx/default:/etc/nginx/sites-enabled/default
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
phpfpm:
image: php:fpm
links:
- database:mysql
ports:
- "7051:9000"
volumes:
- ./public:/usr/share/nginx/html
database:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: admin
ports:
- "7052:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
links:
- database:mysql
ports:
- "7053:80"
environment:
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: admin
PMA_ARBITRARY: 1
如果无需构建我自己的 Dockerfile 就可以解决这个问题,那就太好了。 但如果必须的话,我会的。这不是问题。
docker-compose 是 Dockerfile 的 "api" 类型。您需要在 Dockerfile
中添加这些库(apt-get 等...)Dockerfile 是你的朋友!
你的PHP文件在一个docker容器或里面吗运行外面 docker,在主机里面?
如果它在 运行 内部 docker 容器中,它在哪个服务中?请注意 nginx
服务没有 "links" 配置,这意味着它只能通过 "database" 主机名访问数据库。还要检查 端口 (在此 post 的末尾)。
如果您的 PHP 文件在 运行 外部 ,那么您必须在连接字符串中使用 localhost 而不是 mysql,例如所以:'mysql:host=localhost;dbname=mysql;charset=utf8'
。这是因为 docker 的内部 DNS 就是:内部。您无法在 docker.
同样重要的是,您的连接字符串未指定端口,在您的情况下为 7052。由于您要从 7052 重定向到 3306,我认为 3306 是 mysql 的默认端口,如果您不指定它,驱动程序会假定为 3306。明确说明主机和端口始终是个好主意。查看有关 PHP 数据库连接字符串的文档(因为我对 php 一无所知)。可能是 ...;port=7052
之类的。
此外,请阅读您正在使用的 docker-compose links
。它现在已被弃用,所以我建议不要在未来的项目中使用它,我什至建议花一些时间删除它。如果一切顺利,应该需要30秒到5分钟,而且它不会再困扰你了。
A 找到了解决方案。
首先,主机必须是 mysql
而不是我容器的名称(即 database
):
$mydb = new PDO('mysql:host=mysql;dbname=mysql;charset=utf8', 'root', 'admin');
在 phpfpm 容器内(可通过命令 docker-compose run --rm <container-name> bash
访问),我必须通过删除其开头的分号来启用配置文件 php.ini
中的 extension=php_pdo_msql
行行。
为了避免在 docker-compose up
之后每次都手动执行此操作,我将 docker-compose.yml
文件中的 phpfpm 服务替换为以下 Dockerfile
:
FROM php:fpm
RUN docker-php-ext-install pdo pdo_mysql
最后,只需使用命令 docker-compose build .
构建映像(将 .
替换为包含 docker-compose.yml
文件的目录的路径)。
它非常适合我。