質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.21%

Docker-composeで作った環境で、phpからmysqlへのPDO接続が拒否されてしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 550

mnhsmntk

score 4

前提・実現したいこと

Docker-composeでnginx/php/mysqlのlocal環境を作成しました。
phpからdbにPDO接続してsplクエリの結果を表示させたいのですが、何故か接続が拒否されてしまいます。

発生している問題・エラーメッセージ

以下のエラーが表示されてしまい、行き詰まっています。
主に設定値を変更して二日ほど悪戦苦闘していますが、エラーが解消されません。(エラーの内容が変わることはありますが)
何か、設定漏れや間違いがあるのでしょうか?
ご教授頂けますと幸いです。

SQLSTATE[HY000] [2002] Connection refused


※http://127.0.0.1:8080/にアクセスして、phpinfo()などを記載したphpファイルが正常に処理されて表示される所まで確認できています。
※docker-compose後にdocker execしてmysqlのコンテナに入ってshow tablesしたりはできています。

該当のソースコード

以下のようなディレクトリ/ファイル構造になっています。

mysql----data----m_user.sql
       |
       ---Dockerfile
       |
       ---my.conf

nginx----default.conf
       |
       ---Dockerfile

php----php.ini
     |
     |---Dockerfile

web----index.php

docker-compoes.yml

docker-compose.ymlの内容は以下の通りです。

version: '2'

services:
  nginx:
    container_name: nginx
    build:
      context: "./nginx"
      dockerfile: "Dockerfile"
    ports:
      - "8080:80"
    volumes:
      - ./web:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    links:
      - php

  php:
    container_name: php
    build:
      context: "./php"
      dockerfile: "Dockerfile"
    volumes:
      - ./web:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini
    links:
      - mysql

  mysql:
    container_name: mysql
    build:
      context: "./mysql"
      dockerfile: "Dockerfile"
    ports:
      - 3306:3306
    environment:
      MYSQL_HOST: localhost
      MYSQL_DATABASE: mysql_db
      MYSQL_USER: mysql_user
      MYSQL_PASSWORD: mysql_pass
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./mysql/my.conf:/etc/mysql/conf.d/my.conf
      - ./mysql/data:/docker-entrypoint-initdb.d

php/index.phpの内容は以下の通りです。

<?php
    try {
        $char = "utf8";
        $host = 'mysql';
        $db = 'mysql_db';
        $user = 'mysql_user';
        $pass = 'mysql_pass';
        $dsn = 'mysql:host=' . $host . ';dbname=' . $db . ';charset=' . $char;
        $dbh = new PDO($dsn, $user, $pass);

    } catch (PDOException $e) {
        // エラーが発生した場合は「500 Internal Server Error」でテキストとして表示して終了
        header('Content-Type: text/plain; charset=UTF-8', true, 500);
        exit($e->getMessage()); 
    }

    // Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝える
    // (これか <meta charset="utf-8"> の最低限どちらか1つがあればいい. 両方あっても良い.)
    header('Content-Type: text/html; charset=utf-8');
    ?>

php/Dockerfileの内容は以下の通りです。

FROM php:fpm-alpine

RUN docker-php-ext-install pdo_mysql

mysql/Dockerfileの内容は以下の通りです。

FROM mysql:latest

※関係しそうなファイルの内容のみ上げました。

試したこと

●パスワードやユーザ名などのDB接続情報の誤りがないかチェック
●DBのhostを「localhost」に変更
●DBのhostを「127.0.0.1」に変更
●DBのhostをコンテナのIPに変更
●DBのhostをDockerのサービス名に変更
●DBのhostをDockerのコンテナ名に変更

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • euledge

    2019/02/03 12:34

    $user = 'mysrooql_user' というのは正しいのでしょうか?

    キャンセル

  • mnhsmntk

    2019/02/03 17:03

    ご指摘、ありがとうございます。
    当該のDBユーザの値は誤りです。(転載する際に無用な文字列が入り込んでしまったようです)

    しかし、正しい値で修正後もエラー内容も変化はなく、状況は変わらずです。

    キャンセル

回答 2

check解決した方法

0

解決しました!

知人からの助言で、mysqlのバージョンを指定してdocker-dompose up -dをし直してみた所、正常に接続されました。
その状態でSELECT文を実行して、きちんと結果も表示されています。

やってことは以下のようにmysqlのバージョンを指定したこと。
※ついでにphpやnginxに対してもバージョンを指定しています。

#mysqlDockerfile

FROM mysql:5.7
#phpのDockerfile

FROM php:7.3-fpm-alpine

RUN docker-php-ext-install pdo_mysql
#nginxDockerfile

FROM nginx:1.15-alpine

現時点のmysqlの最新版は8.0。
このバージョンで何かが起こっているようです。。。
原因を追究したいところですが、ひとまずの目的は達成しました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/05 11:12

    MySQL8.0からパスワードの認証方法のデフォルトが変更になっているのでそれが原因かもしれないですね。

    【参考】https://www.petitmonte.com/database/mysql_authentication_plugin.html

    キャンセル

  • 2019/02/06 12:57

    コメントありがとうございます!

    参考サイトを基にdocker-compose.ymlにコマンドを追加したところ、正常に接続する事ができました。

    なるほど、認証方式の問題だったんですね。
    これで本当にスッキリできました!

    キャンセル

0

解決しました!

知人からの助言で、mysqlのバージョンを指定してdocker-dompose up -dをし直してみた所、正常に接続されました。
その状態でSELECT文を実行して、きちんと結果も表示されています。

やってことは以下のようにmysqlのバージョンを指定したこと。
※ついでにphpやnginxに対してもバージョンを指定しています。

#mysqlDockerfile

FROM mysql:5.7
#phpのDockerfile

FROM php:7.3-fpm-alpine

RUN docker-php-ext-install pdo_mysql
#nginxDockerfile

FROM nginx:1.15-alpine

現時点のmysqlの最新版は8.0。
このバージョンで何かが起こっているようです。。。
原因を追究したいところですが、ひとまずの目的は達成しました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる