我正在学习Docker,我仍然很陌生。我想让PHP 7 FPM,Nginx和MariaDB一起工作( 我正在使用this版本的PHP 7 FPM,因为它已经安装了MySQLi但是我收到以下错误:
警告:mysqli_connect():( HY000 / 2002): /usr/share/nginx/html/index.php 中没有此类文件或目录< b> 4
错误:无法连接到MySQL。 调试错误:2002 调试错误:没有这样的文件或目录
我的index.php看起来像这样:
<?php
header('Content-Type: application/json');
$link = mysqli_connect("localhost", "admin", "admin", "admin");
if (!$link) {
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;
mysqli_close($link);
我的Dockerfile看起来像这样:
version: '2'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx/site.conf:/etc/nginx/conf.d/default.conf
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
- ./public:/usr/share/nginx/html
links:
- php:php
php:
image: danieldent/php-7-fpm
volumes:
- ./public:/usr/share/nginx/html
- ./logs/log.conf:/usr/local/etc/php-fpm.d/zz-log.conf
- ./PHP/php.ini:/etc/php/7.0/fpm/php.ini
- ./PHP/php.ini:/usr/local/etc/php/conf.d/php.ini
links:
- mariadb:mysqlip
mariadb:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: pw
stdin_open: true
tty: true
ports:
- 3306:3306/tcp
labels:
io.rancher.container.pull_image: always
volumes:
- ./database:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- mariadb:db
我的php.ini文件中也启用了php_mysqli.dll扩展名。
同样,我对码头工作者来说仍然很陌生但是真的想让这个工作正常,感谢任何建议。
答案 0 :(得分:0)
您是否尝试过使用127.0.0.1
代替localhost
?我相信使用localhost
强制客户端尝试使用本地Unix套接字而不是TCP来讨论here并且它没有找到你的php上不存在的mysql.sock
文件容器,因为MySQL安装在不同的容器上,因此“没有这样的文件或目录”错误。
作为建议,我建议使用Docker的网络/链接功能来实现Docker方式,这样您就可以利用它的一些DNS功能,使您的设置更加轻松和安全。目前,您将MySQL数据库端口发布到主机,因此,外部世界,并使您的PHP容器依赖于这一事实,以便它可以通过localhost
连接。实际上,它只需要在网络中暴露给容器已默认内部共享的网络中的PHP服务。更改您的撰写文件以公开这些端口而不是发布它们(微妙,我知道),如下所示:
mariadb:
...
expose:
- "3306"
...
由于您已在mariadb
服务中将mysqlip
服务称为php
,因此Docker的built-in container DNS resolution允许您通过链接别名引用您的容器,您的PHP代码现在可以使用"mysqlip"
而不是"localhost"
或"127.0.0.1"
连接到MySQL,Docker将负责在其网络中找到正确的容器。
可以找到有关expose
与ports
背后的概念差异的更多信息here
答案 1 :(得分:0)
$ link = mysqli_connect(&#34; localhost&#34;,&#34; admin&#34;,&#34; admin&#34;,&#34; admin&#34;);
更改主变量&#39; localhost &#39;到&#39; mariadb &#39; - 与您的容器 mariadb 名称
完全相同