&引用;错误:mysqli_connect()没有这样的文件或目录;。PHP 7 FPM、MariaDB、Nginx、Docker

&引用;错误:mysqli_connect()没有这样的文件或目录;。PHP 7 FPM、MariaDB、Nginx、Docker,php,nginx,mysqli,docker,docker-compose,Php,Nginx,Mysqli,Docker,Docker Compose,我正在学习Docker,对它还是相当陌生的。我正试图让PHP7FPM、Nginx和MariaDB一起工作( 我使用的是PHP 7 FPM版本,因为它已经安装了MySQLi),但我收到以下错误: 警告:mysqli_connect():(HY000/2002):第4行的/usr/share/nginx/html/index.php中没有此类文件或目录 错误:无法连接到MySQL。 电话号码:2002 调试错误:没有这样的文件或目录 My index.php如下所示: <?php head

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

警告:mysqli_connect():(HY000/2002):第4行的/usr/share/nginx/html/index.php中没有此类文件或目录
错误:无法连接到MySQL。 电话号码:2002 调试错误:没有这样的文件或目录

My 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);
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的新手,但我真的很想让它工作起来,谢谢你的建议。

你试过使用
127.0.0.1
而不是
localhost
?我相信使用
localhost
会迫使客户机尝试使用本地Unix套接字连接,而不是像前面讨论的那样通过TCP连接,并且它找不到php容器上不存在的
mysql.sock
文件,因为mysql安装在不同的容器上,因此出现了“没有这样的文件或目录”错误

作为一个建议,我建议使用Docker的网络/链接功能以Docker的方式完成这项工作,这样您就可以利用它的一些DNS功能,并使您的设置更加便携和安全。目前,您正在将MySQL数据库端口发布到主机,从而发布到外部世界,并使php容器依赖于这一事实,以便它可以通过
localhost
进行连接。实际上,它只需要公开给网络中的PHP服务,默认情况下容器已经在内部共享。更改撰写文件以公开这些端口,而不是像这样发布它们(我知道很微妙):

由于您已经在
php
服务中将
mariadb
服务称为
mysqlip
,Docker允许您通过其链接别名引用容器,因此您的php代码现在可以使用
“mysqlip”
而不是
“localhost”
“127.0.0.1”连接到MySQL
,Docker将负责在其网络中找到正确的容器

有关
expose
port
之间概念差异的更多信息,请参见

$link=mysqli_connect(“localhost”、“admin”、“admin”、“admin”)


将主机变量“localhost”更改为“mariadb”——与您的容器mariadbname

完全相同,这并不是说缺少
mysqli\ucode>函数。它说它无法连接到DB服务器
无法连接到MySQL
你有没有发现我也有同样的问题?
mariadb:
  ...
  expose:
    - "3306"
  ...