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

时间:2016-12-13 19:53:57

标签: php nginx mysqli docker docker-compose

我正在学习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扩展名。

同样,我对码头工作者来说仍然很陌生但是真的想让这个工作正常,感谢任何建议。

2 个答案:

答案 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将负责在其网络中找到正确的容器。

可以找到有关exposeports背后的概念差异的更多信息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 名称

完全相同