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

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

新規登録して質問してみよう
ただいま回答率
85.45%
MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Docker

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

Q&A

解決済

1回答

665閲覧

Dockerで構築したLaravelがDBに接続できない

jdfwflwwfw

総合スコア1

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Docker

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

0グッド

0クリップ

投稿2023/04/22 03:49

編集2023/04/22 04:17

実現したいこと

Dockerで構築したLaravelをDBに接続
コンテナの中からmysql接続し、migrateしたい。

前提

※Laravelのwelcomeページが表示されるところまで成功しました。
※A5:SQLを用いて、以下の画像の通り設定し接続できることを確認しています。

イメージ説明

発生している問題・エラーメッセージ

DBヘ接続できない。
DB_HOSTを下記のいずれかにしてもすべて同じエラーが返ってきます。
外部ツールやコマンドからはmysqlへ接続できるのに、コンテナの中からmigrate時にのみ接続できない。

# php artisan migrate Illuminate\Database\QueryException SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = database and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712 708▕ // If an exception occurs when attempting to run a query, we'll format the error 709▕ // message to include the bindings with SQL, which will make this exception a 710▕ // lot more helpful to the developer instead of just the database's errors. 711▕ catch (Exception $e) { ➜ 712▕ throw new QueryException( 713▕ $query, $this->prepareBindings($bindings), $e 714▕ ); 715▕ } 716▕ } +33 vendor frames 34 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) #

該当のソースコード

env

1APP_NAME=Laravel 2APP_ENV=local 3APP_KEY=base64:C0kDvtLWg/z0Mp/F6fLOCg1eY1MydGjybjWFqtCUsBc= 4APP_DEBUG=true 5APP_URL=http://localhost 6 7LOG_CHANNEL=stack 8LOG_DEPRECATIONS_CHANNEL=null 9LOG_LEVEL=debug 10 11DB_CONNECTION=mysql 12DB_HOST=localhost or db or 127.0.0.1 13DB_PORT=3307 14DB_DATABASE=database 15DB_USERNAME=db-user 16DB_PASSWORD=db-pass 17 18・・・

docker

1version: '3' 2services: 3 app: 4 container_name: app 5 build: ./docker/php 6 volumes: 7 - .:/var/www 8 nginx: 9 image: nginx 10 container_name: nginx 11 ports: 12 - 8001:81 13 volumes: 14 - .:/var/www 15 - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf 16 working_dir: /var/www 17 depends_on: 18 - app 19 db: 20 image: mysql:5.7 21 volumes: 22 - ./docker/db/data:/var/lib/mysql 23 - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 24 - ./docker/db/sql:/docker-entrypoint-initdb.d 25 ports: 26 - 3307:3306 27 environment: 28 MYSQL_ROOT_PASSWORD: root 29 MYSQL_DATABASE: database 30 MYSQL_USER: db-user 31 MYSQL_PASSWORD: db-pass 32 TZ: 'Asia/Tokyo' 33 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 34・・・

試したこと

補足情報(FW/ツールのバージョンなど)

以下のサイトを参考にしてます。
必ず目を通してください。
https://www.torat.jp/laravel-docker-lemp/
https://posipan.com/docker-laravel-db-connection/
https://www.wakuwakubank.com/posts/596-mysql-8-with-docker/

追記 13:15分

別件ですがオンラインゲームを起動したところ、サーバーへ繋がらなくなってました。パソコン自体の何かの設定が変わったようで、不具合が出てきたため数日前のdockerをいじる前までパソコンシステムの復元を試したところ、ゲームサーバーは繋がるようになりました。何かの参考になれば。

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

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

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

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

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

guest

回答1

0

ベストアンサー

dockerにおいて、コンテナ間の通信はサービス名と内部ポートを利用する必要があります。
下記の様に設定してください。

DB_HOST=db DB_PORT=3306

投稿2023/04/22 03:59

Eggpan

総合スコア2872

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

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

jdfwflwwfw

2023/04/22 04:14

DB_HOST=db DB_PORT=3306 はい。3307は、別コンテナで3306を使用しているのでポートを変えています。DB_HOSTは既に記載してある通り、試しています。 mysql:5.7 ・・・ 33060/tcp, 0.0.0.0:3307->3306/tcp ps aux?だったかな、コマンド打って出てくる内容です。
Eggpan

2023/04/22 04:18 編集

3307:3306と指定した際、3307は外部ポートです。 docker hostのIPアドレスを指定するなどすればこのポートで通信することはできなくは無いですが、通常はコンテナ間通信で外部ポートを利用しません。 A5:SQLを利用する場合はコンテナの外からのアクセスになるので、外部ポートを利用します。
jdfwflwwfw

2023/04/22 04:24 編集

と、言いますと例えば、Aコンテナで使用しているバージョンのmysql、ポートをBコンテナでも設定していたとしても同時起動?が可能ってことですか? 別ポートにするべきだが、私の記載の仕方が間違っているということですか? すいません、外部ポートが未だよくわかっておらず調べ中です。
Eggpan

2023/04/22 04:26

コンテナとして外部ポートを設定せずに起動する場合、それぞれのホストは分かれていますので、例えばdb2などと名前をつけてmysqlを追加で起動することはできます。 外部ポートを設定して外からアクセスをさせる場合、dockerホストのポートを利用しますので、これは一意である必要があります。 今回の docker-compose.yml の例でいうと、外部ポートは 8081と3307 です。
jdfwflwwfw

2023/04/22 05:00

同じバージョンのサービスを使いまわした方が良いかと思ってやってたんですが。。 外部ポートだけ理解できません。
Eggpan

2023/04/22 05:13

使い回すというのが何のことを言っているのかが分からないですが、例として同じポートを持つコンテナを起動するケースを出しただけであって、mysqlコンテナを更に追加で立ち上げる意味はあまりないです。 dockerにおいてportsを指定しない場合、外部アクセスは出来ません。 左側の数値が外部アクセス用のポート、右側がコンテナで受付するポートになります。 dockerを起動しているホストからアクセスする場合、 127.0.0.1:8081はappコンテナの81番ポートに繋がります。 127.0.0.1:3307はdbコンテナの3306番ポートに繋がります。 コンテナ間の通信では外部アクセス用のポートは利用しませんので、 app:81 やdb:3306 といったホスト名・ポートを利用します。 コンテナ内での127.0.0.1は、それぞれのコンテナ自身を指すことになります。
jdfwflwwfw

2023/04/22 05:45

>使い回すというのが何のことを言っているのかが分からない ここは私のイメージで話してたんですが、Aコンテナでインストールしたmysql 5.7を、Bコンテナでも使っているイメージでした。ポートを分けただけであって同じmysqlを使用しているつもりでした。誤りで本当は同じバージョンでも別のmysqlとして稼働してたんですかね。 >左側の数値が外部アクセス用のポート、右側がコンテナで受付するポートになります。 そうなんですね。。右側の数値を左側の数値として使用するみたいな意味だと思ってました。 ports: - 3307:3306 <- ここってなんて調べたら詳細が出てきますか?その回答のソースが知りたいです。 >db:3306 といったホスト名・ポートを利用します。 全てのコンテナは共通で3306を指定すればいいんですかね?
Eggpan

2023/04/22 06:53

servicesに定義したコンテナはそれぞれが別のIPアドレスを持ち、別プロセスとして起動します。 portsについては公式ドキュメントを有志の方が日本語訳しているページが分かりやすいかと思います。 https://docs.docker.jp/compose/compose-file/compose-file-v3.html#ports > 全てのコンテナは共通で3306を指定すればいいんですかね? これについてはMySQLの場合はその通りです。 ただし、MySQL自体のコンフィグファイルを変更して起動すれば3306以外でも待受可能ではあるので、その場合を除きます
jdfwflwwfw

2023/04/22 16:20

Migration table created successfully うまくいきました。ありがとうございました。 もう一度よく調べて頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問