2016-12-13 80 views
1

我正在學習Docker,我對它仍然很陌生。我試圖讓PHP 7 FPM,Nginx的和MariaDB的共同努力(我使用PHP 7 FPM的this版本 ,因爲它配備了庫MySQLi已安裝的),但我收到以下錯誤:「錯誤:mysqli_connect()沒有這樣的文件或目錄」。 PHP 7 FPM,MariaDB,Nginx,Docker

Warning: mysqli_connect(): (HY000/2002): No such file or directory in /usr/share/nginx/html/index.php on line 4
Error: Unable to connect to MySQL. Debugging errno: 2002 Debugging error: No such file or directory

我的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擴展名也enabeled在我的PHP .ini文件。

我再次對碼頭工人仍然很陌生,但真的想得到這個工作,謝謝你的任何建議。

+0

這並不是說'mysqli_'函數缺失。它說它無法連接到數據庫服務器'無法連接到MySQL' – Machavity

+0

你有沒有想過我有同樣的問題? – mtpultz

回答

0

您是否嘗試過使用127.0.0.1而不是localhost?我相信使用localhost強制客戶端嘗試使用本地Unix套接字而不是TCP進行連接,如討論的here所示,並且它找不到mysql.sock文件,該文件在您的php容器中不存在,因爲MySQL安裝在不同的容器上,因此「沒有這樣的文件或目錄」錯誤。

作爲一個建議的話,我會建議使用Docker的網絡/鏈接功能來實現Docker的這種方式,這樣您就可以利用它的一些DNS功能,並使您的設置更加便攜和安全。目前,您正在將您的MySQL數據庫端口發佈到主機,因此,外部世界,並使您的PHP容器依靠這個事實,以便它可以通過localhost連接。實際上,它只需要暴露於網絡中的PHP服務,默認情況下容器已經在內部共享。更改您撰寫的文件揭露,而不是發佈它們的端口(微妙的,我知道),像這樣:

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

既然你已經提到你mariadb服務爲mysqlipphp服務中,碼頭工人built-in container DNS resolution讓你通過它的鏈接別名來引用您的容器,以便您的php代碼現在可以使用"mysqlip"而不是"localhost""127.0.0.1"連接到MySQL,並且Docker將負責在其網絡中找到正確的容器。背後expose VS ports概念上的差異

的更多信息,可以發現here

0

$link = mysqli_connect("localhost", "admin", "admin", "admin");

變化的主變量 '本地主機' 到 'MariaDB的' - 正是因爲你的容器MariaDB的

相關問題