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

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

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

1201閲覧

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

mnhsmntk

総合スコア10

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2019/02/01 23:41

編集2019/02/03 08:43

前提・実現したいこと

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のコンテナ名に変更

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2019/02/03 03:34

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

2019/02/03 08:03

ご指摘、ありがとうございます。 当該のDBユーザの値は誤りです。(転載する際に無用な文字列が入り込んでしまったようです) しかし、正しい値で修正後もエラー内容も変化はなく、状況は変わらずです。
guest

回答2

0

解決しました!

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

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

#mysqlのDockerfile FROM mysql:5.7
#phpのDockerfile FROM php:7.3-fpm-alpine RUN docker-php-ext-install pdo_mysql
#nginxのDockerfile FROM nginx:1.15-alpine

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

投稿2019/02/03 09:09

mnhsmntk

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

解決しました!

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

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

#mysqlのDockerfile FROM mysql:5.7
#phpのDockerfile FROM php:7.3-fpm-alpine RUN docker-php-ext-install pdo_mysql
#nginxのDockerfile FROM nginx:1.15-alpine

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

投稿2019/02/03 09:08

mnhsmntk

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mnhsmntk

2019/02/06 03:57

コメントありがとうございます! 参考サイトを基にdocker-compose.ymlにコマンドを追加したところ、正常に接続する事ができました。 なるほど、認証方式の問題だったんですね。 これで本当にスッキリできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問