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

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

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

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

MySQL

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

PHP

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

Docker

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

Q&A

解決済

2回答

4756閲覧

DockerでPHPからMySQLに接続ができません

退会済みユーザー

退会済みユーザー

総合スコア0

docker-compose

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

MySQL

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

PHP

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

Docker

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

0グッド

0クリップ

投稿2021/05/19 14:28

編集2021/05/19 14:31

Windows10からDockerを利用してApache+PHP+MySQLの環境を作ろうと思いDockerfileとdocker-composeを利用しました。PHPのコンテナ化、MySQLのコンテナ化は確認できたのですがPHPからMySQLへ接続しようとするとSQLSTATE[HY000] [2002] Connection refusedというエラーが表示され接続できません。PHPからMySQLへの接続を確認したいです。

検索してもわからなかった疑問としてindex.phpから接続を確認する際のuserpasswordはdocker-composeに指定したMYSQL_USERMYSQL_PASSWORDで合っているのかという点です。

どなたかアドバイスをいただけると嬉しいです。よろしくお願いいたします。

各種設定ファイル

DockerCompose

1version: '3' 2services: 3 php: 4 build: ./php 5 volumes: 6 - ./php:/var/www/html 7 ports: 8 - 8080:80 9 depends_on: 10 - db 11 db: 12 build: ./mysql 13 command: 14 mysqld --default-authentication-plugin=mysql_native_password 15 environment: 16 MYSQL_ROOT_PASSWORD: **** 17 MYSQL_DATABASE: db 18 MYSQL_USER: user 19 MYSQL_PASSWORD: **** 20 TZ: 'Asia/Tokyo' 21 ports: 22 - "3306:3306" 23 volumes: 24 - ./mysql/mysql_init:/docker-entrypoint-initdb.d 25 - ./mysql/mysql_data:/var/lib/mysql 26 - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf

DockerfilePHP

1FROM php:8.0.6-apache 2 3COPY ./php.ini /usr/local/etc/php 4 5RUN apt-get update \ 6 && docker-php-ext-install pdo_mysql mysqli

DockerfileMySQL

1FROM mysql:8.0 2 3COPY ./my.cnf /etc/mysql/conf.d/my.cnf 4 5RUN chmod 644 /etc/mysql/my.cnf

PHPini

1[Date] 2date.timezone = "Asia/Tokyo" 3[mbstring] 4mbstring.internal_encoding = "UTF-8" 5mbstring.language = "Japanese" 6pdo_mysql.default_socket=/tmp/mysql.sock 7mysql.default_socket=/tmp/mysql.sock 8mysqli.default_socket=/tmp/mysql.sock

Mycnf

1[mysql] 2default-character-set=utf8mb4 3 4[mysqld] 5character-set-server=utf8mb4 6collation-server=utf8mb4_unicode_ci 7 8[client] 9default-character-set=utf8mb4

indexPHP

1<?php 2$dsn = 'mysql:dbname=db;port=3306;charset=utf8mb4;host=127.0.0.1'; 3$user = 'user'; 4$password = '****'; 5 6 7try { 8 $dbh = new PDO($dsn, $user, $password); 9 echo "接続に成功しました\n"; 10} catch (PDOException $e) { 11 echo "接続に失敗しました\n"; 12 echo $e->getMessage() . "\n"; 13}

試したこと

  • index.phpの$dsnのなかでhost=localhostを指定するとSQLSTATE[HY000] [2002] No such file or directoryのエラーになる
  • コマンドプロンプトからMySQLにログインしselect user, plugin from user;でroot, userのpluginがmysql_native_passwordであることを確認
  • MySQLのDockerfileでRUN chmod 777 /usr/local/var/mysqlを指定するがbuildでエラーになり権限を与えられない
  • MySQLにログインしmysql > GRANT ALL ON *.* TO $DB_USER@'127.0.0.1' IDENTIFIED BY 'root' WITH GRANT OPTION;127.0.0.1に権限を与えようとするとERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql > GRANT ALL ON *.* TO $DB_USER@'127.0.0.1' IDENTIFIED BY 'root' WITH GRANT' at line 1というエラーになる

ソフトウェアとイメージファイル

  • Windows 10
  • Docker: 20.10.6, build 370c289
  • MySQL: 8.0
  • PHP: 8.0.6-apache

フォルダ構成

  • Dockerフォルダのなかにmysql, php, web, docker-compose.yml
  • mysqlのなかにmysql_data, mysql_init, Dockerfile, my.cnf
  • phpのなかにDockerfile, index.php, php.ini

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/19 14:32

ありがとうございます。見落としてました。タグを追記しました。
guest

回答2

0

php と db は別のホストになるので、接続先は 127.0.0.1 でなく db と指定してみてください。

php

1$dsn = 'mysql:dbname=db;port=3306;charset=utf8mb4;host=db';

投稿2021/05/19 14:43

yh1224

総合スコア653

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

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

退会済みユーザー

退会済みユーザー

2021/05/19 14:46

お二人の回答のおかげで数時間の悩みが解決しました。こんな簡単なことだとは思いもよりませんでした。本当にありがとうございました!
guest

0

ベストアンサー

PHP

1$dsn = 'mysql:dbname=db;port=3306;charset=utf8mb4;host=127.0.0.1';

PHP

1$dsn = 'mysql:dbname=db;port=3306;charset=utf8mb4;host=db';

では?

参考)
https://qiita.com/dyoshikawa/items/05d627b962da35f7d5b6

投稿2021/05/19 14:38

AbeTakashi

総合スコア4474

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

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

退会済みユーザー

退会済みユーザー

2021/05/19 14:46

お二人の回答のおかげで数時間の悩みが解決しました。こんな簡単なことだとは思いもよりませんでした。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問