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

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

ただいまの
回答率

90.75%

  • PHP

    19209questions

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

  • MySQL

    5524questions

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

  • Docker

    612questions

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

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

受付中

回答 2

投稿 編集

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

xin

score 10

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

今回、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は同じものを設定しました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • xenbeat

    2018/05/27 18:26

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

    キャンセル

  • xin

    2018/05/27 22:04

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

    キャンセル

  • xenbeat

    2018/05/27 23:10 編集

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

    キャンセル

回答 2

0

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

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

ports:
  - "3306:3306"

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

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

php:
    environment:
      DATABASE_HOST: mysql
DB_HOST=mysql

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

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

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

php:
    build: ./php
    container_name: "laravel-php"
    env_file: .env
    environment:
      DATABASE_HOST: mysql
    links:
      - mysql
    volumes:
      - ./src:/var/www/src
mysql:
    image: mysql:5.7.19
    env_file: .env
    volumes:
      - ./db-data:/var/lib/mysql

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/29 03: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

    キャンセル

  • 2018/05/29 08:53

    > また、dockerのlinkおよびdocker-composeのlinksはレガシーなオプションで使用は非推奨となっています。

    失礼しました。てっきりdocker-compose v2のものだと勘違いしていました。
    だとすると原因はわからなくなりますね。環境変数の設定をもう一度確認することをおすすめします。

    キャンセル

0

.env(docker-compose)を

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

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

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

と変更して、

docker-compose down
docker-compose up

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/03 13:40 編集

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

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • PHP

    19209questions

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

  • MySQL

    5524questions

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

  • Docker

    612questions

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