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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

6203閲覧

docker php7からmysqlに接続できない

xin

総合スコア17

MySQL

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

PHP

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

Docker

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

0グッド

0クリップ

投稿2018/05/27 09:20

編集2018/05/27 13:04

お世話になっております。

今回、dokcerでnginx、php、mysqlのコンテナを立ててlaravelの開発環境を作ってみたのですが、migrationでエラーが出てしまいました。

<環境>
docker for mac: Version 18.03.0-ce-mac60
php: 7.2.5
mysql: 5.7.19
laravel: 5.5
node: 8.11.1

<構成>
イメージ説明

db-data: データ格納場所

nginx: defaut.conf

server { listen 80; server_name localhost; charset utf-8; root /var/www/src/public; index index.php; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php$query_string; } location ~ .php$ { fastcgi_split_path_info ^(.+.php)(.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }

src: laravelプロジェクトフォルダ

php: Dockerfile

FROM php:7.2.5-fpm-alpine3.7 RUN docker-php-ext-install pdo_mysql mysqli mbstring

docker-compose.yml

version: '3' services: nginx: image: nginx:1.14.0-alpine container_name: "laravel-nginx" ports: - "80:80" depends_on: - php volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./src:/var/www/src php: build: ./php container_name: "laravel-php" env_file: .env environment: DATABASE_HOST: mysql depends_on: - mysql volumes: - ./src:/var/www/src mysql: image: mysql:5.7.19 env_file: .env ports: - "3306:3306" volumes: - ./db-data:/var/lib/mysql

エラー文言

~/src ❯❯❯ php artisan migrate (master) In Connection.php line 664: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known (SQL: select * from information_schema.tables where table_schema = dev_laravel and table_name = migrations) In Connector.php line 67: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known In Connector.php line 67: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

sequel proでmysqlに接続できたので、単体のコンテナでは動作しているようなのですが、phpから操作するとエラーが出てしまいました。dockerもlaravelも始めたばかりなのでどこかでミスしているのかもしれないのですが、見つけられず、、どなたかご教示いただければと思います。

追記:
.env(laravel) (###でマスク)

APP_NAME=Laravel APP_ENV=local APP_KEY=########### APP_DEBUG=true APP_LOG_LEVEL=debug APP_URL=http://localhost DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=########### DB_USERNAME=########## DB_PASSWORD=########## BROADCAST_DRIVER=log CACHE_DRIVER=file SESSION_DRIVER=file QUEUE_DRIVER=sync REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET=

.env(docker-compose) (###でマスク)

MYSQL_RANDOM_ROOT_PASSWORD=yes MYSQL_DATABASE=####### MYSQL_USER=###### MYSQL_PASSWORD=####### MYSQL_ROOT_PASSWORD=#######

dockerとlaravelのMYDQL_DATABASE、 MYSQL_USER、MYSQL_PASSWORDは同じものを設定しました。

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

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

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

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

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

xenbeat

2018/05/27 09:26

機密情報はmaskして、docker-composeとlaravelの.envを追記ください。
xin

2018/05/27 13:04

いつも有り難うございます!追記させて頂きましたm(_ _)m
xenbeat

2018/05/27 14:15 編集

うーん、ざっと見た感じ設定的には問題はなさそうですね。「migrationでエラーが出てしまいました。」→こちらどこでどのように実行したのか詳細を教えてください。
guest

回答2

0

.env(docker-compose)を

MYSQL_DATABASE=####### MYSQL_PASSWORD=####### MYSQL_ROOT_PASSWORD=#######

のみに変更し、.env(laravel)を

DB_DATABASE=########## DB_USERNAME=root DB_PASSWORD=##########

と変更して、

bash

1docker-compose down 2docker-compose up

とコンテナを立ち上げ直してみても駄目でしょうか?

投稿2018/05/29 11:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

xin

2018/06/03 04:42 編集

遅くなってしまって申し訳ありません。ご指示頂いた通り実行して見たのですが、やはり上記と同じエラー文言が出てしまいました。docker-compose upまではエラーが出ずにできています。
guest

0

docker-composeで起動したphpコンテナからmysqlコンテナへ接続できないとの質問と理解しています。
私はphpのことは何もわかりませんが、エラーにある通り、mysqlのホストを解決できていないと思われます。

docker-compose.ymlではmysqlコンテナのポート設定で以下のように設定されていますが、

ports: - "3306:3306"

dockerのコンテナにポートマッピングを設定した場合、そのコンテナのそのポートは"0.0.0.0"、つまりホストマシン側のポートとマッピングされます。つまり、現状ではmysqlコンテナはおそらくlocalhost:3306で起動しています。

一方でmysqlのホストについては以下のように設定されています。

yml

1php: 2 environment: 3 DATABASE_HOST: mysql

env

1DB_HOST=mysql

まず、Laravelのデータベースドライバがこのどちらの環境変数を使っているのかを確認してください。
その上で、この設定の場合、phpコンテナのプログラムはmysql:3306というホスト/ポートに接続しようとするはずですが、それは失敗するはずです。なぜなら、mysqlコンテナはホストネットワーク上のアドレスにbindされており、docker-composeネットワーク内のphpコンテナからはアクセスできません。

mysqlというホスト名を使いたい場合は、docker-composeのlinksを使い、phpとmysqlを同じネットワーク内で起動させる必要があります。

ですので、docker-compose.ymlの設定を

yml

1php: 2 build: ./php 3 container_name: "laravel-php" 4 env_file: .env 5 environment: 6 DATABASE_HOST: mysql 7 links: 8 - mysql 9 volumes: 10 - ./src:/var/www/src 11mysql: 12 image: mysql:5.7.19 13 env_file: .env 14 volumes: 15 - ./db-data:/var/lib/mysql

のように変えてみてください。これで、phpとmysqlは同じdocker-composeのdefaultネットワーク内で起動し、phpコンテナからmysqlというホスト名でアクセスできるようになるはずです。

投稿2018/05/27 16:57

keroxp

総合スコア114

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

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

xenbeat

2018/05/28 18:16

> mysqlというホスト名を使いたい場合は、docker-composeのlinksを使い、phpとmysqlを同じネットワーク内で起動させる必要があります。 linksを使わなくても、サービス名がmysqlになっているので、 デフォルトで作成されるネットワークでそのまま通信できると思います。 また、dockerのlinkおよびdocker-composeのlinksはレガシーなオプションで使用は非推奨となっています。 https://docs.docker.com/network/links/ https://docs.docker.com/compose/compose-file/#links
keroxp

2018/05/28 23:53

> また、dockerのlinkおよびdocker-composeのlinksはレガシーなオプションで使用は非推奨となっています。 失礼しました。てっきりdocker-compose v2のものだと勘違いしていました。 だとすると原因はわからなくなりますね。環境変数の設定をもう一度確認することをおすすめします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問