“错误:mysqli_connect()没有这样的文件或目录”。 PHP 7 FPM,MariaDB,Nginx,Docker

我正在学习Docker,对此我还是很陌生的。 我试图让PHP 7的FPM,Nginx和MariaDB一起工作(我使用这个版本的PHP 7 FPM,因为它与MySQLi已经安装),但我收到以下错误:

警告 :mysqli_connect():(HY000 / 2002):第4/usr/share/nginx/html/index.php中没有这样的文件或目录
错误:无法连接到MySQL。 debuggingerrno:2002debugging错误:没有这样的文件或目录

我的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_mysqli.dll扩展名也在我的php.ini文件中。

再一次,我对docker工作人员还是很新的,但是真的想要这个工作,谢谢你的任何build议。

你有尝试使用127.0.0.1而不是localhost ? 我相信使用localhost强制客户端尝试连接使用本地Unix套接字,而不是通过TCP在这里讨论,并没有findmysql.sock文件不存在于您的PHP容器,因为MySQL安装在不同的容器上,因此“没有这样的文件或目录”的错误。

作为一个build议的话,我会build议使用Docker的networking/链接function来完成Docker的这种方式,这样你就可以利用它的一些DNSfunction,使你的设置更加便携和安全。 目前,您正在将您的MySQL数据库端口发布到主机,因此,外部世界,并使您的PHP容器依靠这个事实,以便它可以通过localhost连接。 实际上,它只需要在networking中暴露给你的PHP服务,默认情况下容器已经在内部共享。 改变你的撰写文件来公开这些端口,而不是发布他们(微妙,我知道),如下所示:

 mariadb: ... expose: - "3306" ... 

由于您已经在您的php服务mysqlip您的mariadb服务称为mysqlip ,因此Docker的内置容器DNSparsing允许您通过链接别名来引用您的容器,以便您的php代码现在可以使用"mysqlip"连接到MySQL,而不是"localhost""127.0.0.1" ,Docker将负责在networking中查找正确的容器。

在这里可以find有关expose VS ports背后的概念差异的更多信息

$ link = mysqli_connect(“localhost”,“admin”,“admin”,“admin”);

将主机variables“ localhost ”更改为“ mariadb– 与您的容器mariadb名称完全相同