2017-09-30 149 views
2

我是Docker的新手,一直試圖弄清楚如何使用PHP連接到我的MariaDB容器,但沒有成功。Docker無法通過PHP連接到mariadb

我試圖在計算器和谷歌搜索,但沒有找到任何有用的信息,所以我希望你們能幫助我。

奇怪的是,當我嘗試使用JetBrains公司DataGrip與本地主機,MySQL和根,管理連接到MariaDB的,我可以連接到數據庫,但不與PDO。

我真的希望你能幫助我,感謝你的時間。

這裏有下列項目文件:

這是我的搬運工,compose.yml文件

version: "3.1" 
services: 

    nginx: 
    image: nginx:alpine 
    container_name: nginx 
    volumes: 
     - ./config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf 
    ports: 
     - "80:80" 
    links: 
     - php 

    php: 
    image: php:7.1-fpm 
    container_name: php 
    links: 
     - mariadb:mysql 
    volumes: 
     - ./public:/public 
    ports: 
     - "9000:9000" 

    mariadb: 
    image: mariadb:10.1 
    container_name: database 
    environment: 
     MYSQL_ROOT_PASSWORD: admin 
    ports: 
     - "3306:3306" 

    phpmyadmin: 
    image: phpmyadmin/phpmyadmin 
    container_name: phpmyadmin 
    links: 
     - mariadb 
    ports: 
     - 8183:80 
    environment: 
     PMA_HOST: mariadb 
     PMA_USER: root 
     PMA_PASSWORD: admin 
     PMA_ARBITRARY: 1 

我的nginx.conf文件:

server { 
    listen 80 default; 

    client_max_body_size 108M; 

    access_log /var/log/nginx/application.access.log; 


    root /public; 
    index index.php; 

    if (!-e $request_filename) { 
     rewrite ^.*$ /index.php last; 
    } 

    location ~ \.php$ { 
     fastcgi_pass php:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log"; 
     fastcgi_buffers 16 16k; 
     fastcgi_buffer_size 32k; 
     include fastcgi_params; 
    } 

} 

我的index.php文件

<?php 

    $servername = "localhost"; 
    $username = "root"; 
    $password = "admin"; 
    $database = "mysql"; 

    try { 
     $conn = new PDO("sqlite:host=".$servername.";dbname=" . $database, $username, $password); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $sql = $conn->prepare("SELECT * FROM testDB"); 
     $sql->execute(); 

     while($result = $sql->fetch(PDO::FETCH_ASSOC)){ 
      $result['myTestData']; 
     } 

    } 
    catch(PDOException $e) { 
     echo "Connection failed: " . $e->getMessage(); 
    } 

?> 
+1

也許你應該在你的DSN – Bart

+0

sqlite'改變''給我mysql'已經試過了,我得到找不到消息驅動程序。 – user3626278

+0

所以你需要安裝/啓用pdo mysql驅動 – Bart

回答

0

這是因爲你正試圖從你的php容器,它解析爲達到與主機localhost數據庫服務器PHP容器本身(與127.0.0.1相同)。

你應該改變你的$servername變量在您撰寫的文件,例如等於你MariaDB的服務名稱"mariadb"

在你的情況下每一個容器,在一個單一的默認網絡之中,是由它的服務名稱解析(除其他事項外),這就是爲什麼你不需要鏈接,這是有點過時。

而且(以防萬一),確保您的數據庫容器實際啓動並準備接收連接。第一次開始需要一段時間。

+0

謝謝!改變本地主機爲「mariadb」做了詭計! – user3626278

0

嘗試創建自己的Dockerfile安裝mysql分機。 靜置泊塢窗撰寫YML:

FROM php:7.1-fpm 

RUN docker-php-ext-install pdo pdo_mysql 

泊塢窗,compose.yml:

php: 
    build: . 
    container_name: php 
    links: 
     - mariadb:mysql 
    volumes: 
     - ./public:/public 
    ports: 
     - "9000:9000" 
+0

我已經這樣做了,但是當連接mysql驅動程序和本地主機時,我得到以下內容:SQLSTATE [HY000] [2002]沒有這樣的文件或目錄。我搜索並發現127.0.0.1應該修復它,但然後我得到SQLSTATE [HY000] [2002]連接被拒絕的錯誤。 – user3626278

+0

根據您的配置。你應該將mysql指向mysql,而不是localhost – Robert

+0

謝謝!安裝驅動程序並將localhost更改爲mysql有訣竅! – user3626278