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

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

ただいまの
回答率

88.78%

Dockerでコンテナ間のmysql疎通ができません。

受付中

回答 1

投稿

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

cayce_danguri

score 10

dockerでmysqlをコンテナ間で疎通できません。

dockerで作成したappコンテナ内のlaravelフォルダでphp artisan migrateを実行すると下記のようなエラーが発生します。

root@4177ab34c56f:/var/www/html/test_app# php artisan migrate

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = test_app and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +34 vendor frames 
  35  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))

最初はlarvel側の.envやconfig/database.phpの設定の問題かと思案しましたが、appコンテナ側からmysqlコンテナに接続できないのでそもぞもdockerの接続方法に問題があるのかと思います。ちなみにmysqlコンテナで

mysql -u test -p


を実行すると問題なくdbにアクセスできます。
dockerに詳しかた、ぜひご教示ください。ヒントだけでも構いません。

ファイル構造

test_app
 - docker-compose.yml
 - docker/
   - php/
      - dockerfile
   - web/
      - default.conf
   - publics/

docker-compose.yml

version: '3'
services:
  web:
    image: nginx:1.15.6
    ports:
      - '8085:80'
    depends_on:
      - app
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - ./publics/:/var/www/html
    networks:
      - app-net

  app:
    build: ./docker/php
    volumes:
      - ./publics/:/var/www/html
    depends_on:
      - mysql
    networks:
      - app-net

  mysql:
    container_name: mysql
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: test_app
      MYSQL_USER: test
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-net

volumes:
  mysql-data:

networks:
  app-net:
    driver: bridge

./docker/php/dockerfile

FROM php:7.2-fpm

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html

./docker/web/default.conf

server {
    listen 80;

    root  /var/www/html/test_app/public;
    index index.php index.html index.htm;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

}

もろもろの環境

Docker version 19.03.8
docker-compose version 1.25.5
Laravel Framework 7.14.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

次の内容を確認しましょう:

app コンテナ側から mysql コンテナに接続できることの証明

app コンテナに MySQL client をインストールして PHP を介さずに接続してみます:

docker-compose.yml

version: '3'
services:
  # ↓ 問題を単純化するためコメントアウトします
  # web:
  #   image: nginx:1.15.6
  #   ports:
  #     - '8085:80'
  #   depends_on:
  #     - app
  #   volumes:
  #     - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
  #     - ./publics/:/var/www/html
  #   networks:
  #     - app-net

  app:
    build: ./docker/php
    # ↓ docker-compose run でアタッチするため追加しました
    command: bash
    depends_on:
      - mysql
    networks:
      - app-net
    # ↓ docker-compose run でアタッチするため追加しました
    tty: 'true'

  mysql:
    container_name: mysql
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: test_app
      MYSQL_USER: test
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-net

volumes:
  mysql-data:

networks:
  app-net:
    driver: bridge

./docker/php/dockerfile

FROM php:7.2-fpm

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html

# ↓ MySQL client のインストール
RUN apt-get update
RUN apt install wget
RUN wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb
ENV DEBIAN_FRONTEND=noninteractive
RUN apt install -y ./mysql-apt-config_0.8.13-1_all.deb
RUN apt-get update
RUN apt install -y mysql-client
FROM php:7.2-fpm

RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html

# MySQL client のインストール
RUN apt-get update
RUN apt install wget
RUN wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb
ENV DEBIAN_FRONTEND=noninteractive
RUN apt install -y ./mysql-apt-config_0.8.13-1_all.deb
RUN apt-get update
RUN apt install -y mysql-client
$ docker-compose run --rm app
Creating network "test-docker-mysql_app-net" with driver "bridge"
Creating mysql ... done
root@885f1acc4c85:/var/www/html# mysql -h mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@hostname;
+--------------+
| @@hostname   |
+--------------+
| 748a0d33bea4 |
+--------------+
1 row in set (0.00 sec)

別のターミナルでコンテナの ID を調べます:

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS              PORTS                                              NAMES
885f1acc4c85        test-docker-mysql_app   "docker-php-entrypoi…"   About a minute ago   Up About a minute   9000/tcp                                           test-docker-mysql_app_run_fccf55be9767
748a0d33bea4        mysql:5.7               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp                  mysql
6

上記の結果より、app コンテナ側から mysql コンテナに接続できることがわかります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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