2017-09-30 17 views
2

私はDockerの新機能で、PHPでMariaDBコンテナにどのように接続できているかを把握しようとしています。DockerはPHPでmariadbに接続できません

私はstackoverflowとgoogleで検索しようとしましたが、有用な情報が見つかりませんでしたので、皆さんが私を助けてくれることを願っています。

私は、JetBrains DataGripでlocalhost、mysql、root、adminを使用して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で 'sqlite'を' mysql'に変更する必要があります。 – Bart

+0

私はこれを試しましたが、ドライバが見つかりませんというメッセージが表示されます。 – user3626278

+0

pdo mysql driverをインストール/有効にする必要があります – Bart

答えて

0

あなたがに解決PHPのコンテナからホスト名localhostを使用してデータベース・サーバに到達しようとしているためですPHPコンテナ自体(127.0.0.1と同じ)。

$servername変数を、作成ファイルのmariadbサービス名と同じにする必要があります。 "mariadb"

あなたのケースでは、単一のデフォルトネットワークにあるすべてのコンテナは、サービス名(他のものの中でも)で解決されるため、リンクが必要ないため、やや非難されています。

また、dbコンテナが実際に開始され、接続を受信できる状態になっていることを確認してください。初めて始めるにはしばらく時間がかかります。

+0

ありがとう! localhostを "mariadb"に変更すると、そのトリックが実行されました! – user3626278

0

mysql extをインストールするには、自分でDockerfileを作成してみてください。 脇ドッキングウィンドウを、それを入れてコン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ドライバとlocalhostと接続すると、次のようになります:SQLSTATE [HY000] [2002]そのようなファイルやディレクトリはありません。私は検索して、127.0.0.1がそれを修正すべきだが、SQLSTATE [HY000] [2002] Connectionがエラーを拒否したことを知りました。 – user3626278

+0

あなたの設定ごとに。あなたはmysqlをmysqlと指すべきであり、localhostは指してはいけません – Robert

+0

ありがとう!ドライバをインストールし、mysqlにlocalhostを変更することがトリックでした! – user3626278

関連する問題