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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Docker

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

Q&A

1回答

5795閲覧

DockerでLaravelの環境構築をしているのですが、PostgreSQLとの接続に失敗します

mammymammy

総合スコア4

Laravel

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

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

Docker

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

0グッド

1クリップ

投稿2020/04/08 03:15

編集2022/01/12 10:55

前提・実現したいこと

dockerでLaravelの環境を作っているものです。

現在は

  • PHPの環境
  • Laravelの環境(プロジェクト生成→初期ページ確認)

が完了しています。

この状態で、初期のマイグレーションファイルをマイグレートしようとすると(php artisan migrate)、

下記のエラーが出てしまいます。

どのように対処すればよろしいでしょうか。

ご回答のほど、よろしくお願いいたします。

エラー

Illuminate\Database\QueryException : SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432? (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE') at /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:670 666| // If an exception occurs when attempting to run a query, we'll format the error 667| // message to include the bindings with SQL, which will make this exception a 668| // lot more helpful to the developer instead of just the database's errors. 669| catch (Exception $e) { > 670| throw new QueryException( 671| $query, $this->prepareBindings($bindings), $e 672| ); 673| } 674| Exception trace: 1 PDOException::("SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host "127.0.0.1" and accepting TCP/IP connections on port 5432?") /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 2 PDO::__construct("pgsql:host=127.0.0.1;dbname=test_db;port=5432;sslmode=prefer", "test_user", "test1234", []) /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 Please use the argument -v to see more details.

該当のソースコード

DBコンテナ

dbコンテナに入り、test_userでtest_dbに入ることはできています...。

sh

1[xxxxMBP]$ docker-compose exec db sh [Laravel_Turtorial]+[master] 2# psql -U test_user test_db 3psql (10.6 (Debian 10.6-1.pgdg90+1)) 4Type "help" for help. 5 6test_db=> select * from test_table; 7 id | name | age 8....

####Dockerfile

Dockerfile

1#ベースイメージの指定 2FROM php:7.3-fpm-alpine 3 4ARG TZ 5ENV COMPOSER_ALLOW_SUPERUSER 1 6ENV COMPOSER_HOME /composer 7 8RUN set -eux && \ 9 apk update && \ 10 apk add --update-cache --no-cache --virtual=.build-dependencies tzdata && \ 11 cp -r /usr/share/zoneinfo/${TZ} /etc/localtime && \ 12 apk del .build-dependencies && \ 13 apk add --update-cache --no-cache postgresql-dev && \ 14 docker-php-ext-install bcmath pgsql pdo_pgsql && \ 15 curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && \ 16 composer config -g repos.packagist composer https://packagist.jp && \ 17 composer global require hirak/prestissimo

####docker-compose.ymlで使用する環境変数を定義した.envファイル

env

1DB_NAME=test_db 2DB_USER=test_user 3DB_PASS=test1234 4TZ=Asia/Tokyo

####docker-compose.yml

yml

1version: "3" 2#アプリケーションを動かすための各要素(サービス) 3services: 4 db: 5 image: postgres:10.6 6 container_name: db 7 environment: 8 TZ: 'Asia/Tokyo' 9 POSTGRES_USER: ${DB_USER} 10 POSTGRES_PASSWORD: ${DB_PASS} 11 POSTGRES_DB: ${DB_NAME} 12 volumes: 13 - ./docker/db/data:/var/lib/postgresql/data 14 - ./docker/db/sql:/docker-entrypoint-initdb.d 15 ports: 16 - 10032:5432 17 app: 18 build: 19 context: ./docker/php 20 args: 21 - TZ=${TZ} #Dockerfileで使用するタイムゾーンの設定 22 volumes: 23 - ./src:/work 24 - ./logs:/var/log/php 25 - ./docker/php/php.ini:/usr/local/etc/php/php.ini 26 working_dir: /work 27 environment: 28 #Laravel設定用の環境変数 29 - DB_CONNECTION=pgsql 30 - DB_HOST=127.0.0.1 31 - DB_DATABASE=${DB_NAME} 32 - DB_USERNAME=${DB_USER} 33 - DB_PASSWORD=${DB_PASS} 34 - TZ=${TZ} #php.iniで使用するタイムゾーンの設定 35 web: 36 image: nginx:1.17-alpine 37 depends_on: 38 - app 39 ports: 40 - 7979:80 41 volumes: 42 - ./src:/work 43 - ./logs:/var/log/nginx 44 - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf 45 environment: 46 - TZ=${TZ}

####Laravelプロジェクト作成時に生成された.envファイル

env

1... 2APP_URL=http://127.0.0.1 3 4LOG_CHANNEL=stack 5 6DB_CONNECTION=pgsql 7DB_HOST=127.0.0.1 8DB_PORT=5432 9DB_DATABASE=test_db 10DB_USERNAME=test_user 11DB_PASSWORD=test1234 12...

試したこと

  • postmaster.pidを削除
  • ポート番号変更

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

Macを使用

追加質問

ホスト側の.envファイルとdocker-compose.yml、コンテナ側の.envファイルを弄ったら解決しました...。

具体的にはホスト側の.envファイルに

env

1DB_HOST=db //追加(postgresではダメだった) 2DB_NAME=test_db 3DB_USER=test_user 4DB_PASS=test1234 5TZ=Asia/Tokyo

DB_HOSTを指定し、

docker

1 app: 2 build: 3 context: ./docker/php 4 args: 5 - TZ=${TZ} #Dockerfileで使用するタイムゾーンの設定 6 volumes: 7 - ./src:/work 8 - ./logs:/var/log/php 9 - ./docker/php/php.ini:/usr/local/etc/php/php.ini 10 working_dir: /work 11 environment: 12 #Laravel設定用の環境変数 13 - DB_CONNECTION=pgsql 14 - DB_HOST=${DB_HOST} 15 - DB_DATABASE=${DB_NAME} 16 - DB_USERNAME=${DB_USER} 17 - DB_PASSWORD=${DB_PASS} 18 - TZ=${TZ} #php.iniで使用するタイムゾーンの設定

environmentでDB_HOSTに指定する。

そして、コンテナ側の.envファイルで

env

1DB_CONNECTION=pgsql 2DB_HOST=${DB_HOST} 3DB_PORT=5432 4DB_DATABASE=test_db 5DB_USERNAME=test_user 6DB_PASSWORD=test1234

ホストで使えるようにしたDB_HOSTを指定する。

このようにすれば、マイグレートできました。

sh

1[xxxx]$ docker-compose exec app ash [Laravel_Turtorial]+[master] 2/work # php artisan migrate 3Nothing to migrate.

ただ、どうしてできたのかがまだイマイチ理解できていません。

もしよろしければ、下の3つの追加質問にお答えいただけませんでしょうか。

よろしくお願いいたします。

① そもそも、「docker-compose.ymlのenvironmentに指定した変数は、環境変数として他のファイルから参照できるようになる」という認識で合っているのか

② ①の認識で合っているのだとしたら、docker-compose.ymlのdbとappに同じような記述(environmentでデータベース関連の情報を渡している)をする必要はないのか

docker

1services: 2 db: 3 ... 4 container_name: db 5 environment: 6 TZ: 'Asia/Tokyo' 7 POSTGRES_USER: ${DB_USER} 8 POSTGRES_PASSWORD: ${DB_PASS} 9 POSTGRES_DB: ${DB_NAME} 10 ... 11 app: 12 ... 13 environment: 14 #Laravel設定用の環境変数 15 - DB_CONNECTION=pgsql 16 - DB_HOST=${DB_HOST} 17 - DB_DATABASE=${DB_NAME} 18 - DB_USERNAME=${DB_USER} 19 - DB_PASSWORD=${DB_PASS} 20 - TZ=${TZ} #php.iniで使用するタイムゾーンの設定

③ ホスト側の.envのDB_HOSTに、dbではなくpostgresと記述したら下記のようなエラーが発生したが、それはなぜか

Illuminate\Database\QueryException : SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name does not resolve (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE') at /work/vendor/laravel/framework/src/Illuminate/Database/Connection.php:670 666| // If an exception occurs when attempting to run a query, we'll format the error 667| // message to include the bindings with SQL, which will make this exception a 668| // lot more helpful to the developer instead of just the database's errors. 669| catch (Exception $e) { > 670| throw new QueryException( 671| $query, $this->prepareBindings($bindings), $e 672| ); 673| } 674| Exception trace: 1 PDOException::("SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name does not resolve") /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 2 PDO::__construct("pgsql:host=postgres;dbname=test_db;port=5432;sslmode=prefer", "test_user", "test1234", []) /work/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:69 Please use the argument -v to see more details.

④ docker-compose.ymlのportsには「ホスト側のポート番号:コンテナ側のポート番号」を指定するが、ホスト側のポート番号は適当に当てられるのに対して、コンテナ側のポート番号は「5432」で固定なのでしょうか(左側は自由に当てられ、3306などにするとエラーが発生した)。

⑤コンテナ側のポート番号が固定だったとして、コンテナ側の.envファイルに定義するDB_PORTとも必ず合わせる必要があるのでしょうか(またはDB_PORTの定義は必ずしないといけないのか)。

yml

1 db: 2 image: postgres:10.6 3 container_name: db 4 environment: 5 TZ: 'Asia/Tokyo' 6 POSTGRES_USER: ${DB_USER} 7 POSTGRES_PASSWORD: ${DB_PASS} 8 POSTGRES_DB: ${DB_NAME} 9 volumes: 10 - ./docker/db/data:/var/lib/postgresql/data 11 - ./docker/db/sql:/docker-entrypoint-initdb.d 12 ports: 13 - 10090:5432 //ここの左は固定?

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

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

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

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

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

yoorwm

2020/04/08 03:31

127.0.0.1というのは自分自身を指すので、appでデータベースが動いている事になってしまいますね
mammymammy

2020/04/08 03:53

ご回答ありがとうございます。 ということは、docker-compose.ymlとLaravelプロジェクトのenvファイルのホストを変えてあげればよろしいのでしょうか。 その場合、どのような指定をすればよろしいですか?
Lulucom

2020/04/08 03:58 編集

マイグレートのコマンド `php artisan migrate` はどこで実行されていますか?(どれかのコンテナでしょうか、それともMacでしょうか)
mammymammy

2020/04/08 04:11

ご返信ありがとうございます。 マイグレートはapp(phpの環境が整っている)コンテナ内で実行しております。
guest

回答1

0

前提として、Docker Compose では、 docker-compose up を実行するディレクトリにある .env ファイルの内容を読み込み、環境変数として利用できます(参考:リファレンス)。

① そもそも、「docker-compose.ymlのenvironmentに指定した変数は、環境変数として他のファイルから参照できるようになる」という認識で合っているのか

参照できません。各サービスのセクション(例えば「db」で書かれたものは、その中だけ)しか有効になりません。

② ①の認識で合っているのだとしたら、docker-compose.ymlのdbとappに同じような記述(environmentでデータベース関連の情報を渡している)をする必要はないのか

両方のサービス(ここでは「db」と「app」)で共通の環境変数を使いたい場合は、お考えの通りです。

③ ホスト側の.envのDB_HOSTに、dbではなくpostgresと記述したら下記のようなエラーが発生したが、それはなぜか

postgres という名前でデータベースに接続できないからです。Docker Compose は内部の名前解決にサービス名を使います。ここでは db というサービス名の定義がありますので、 db というホスト名で Docker 内部で接続できます。

④ docker-compose.ymlのportsには「ホスト側のポート番号:コンテナ側のポート番号」を指定するが、ホスト側のポート番号は適当に当てられるのに対して、コンテナ側のポート番号は「5432」で固定なのでしょうか(左側は自由に当てられ、3306などにするとエラーが発生した)。

今回の PostgreSQL 用のコンテナでは、プロセスがポート 5432 を開くので、posts でのコンテナの中のポート指定を「5432」にする必要があります。仮に「5431」ポートで開いているのであれば、 ports の記述も「5432」にします。

左側はホスト側ですが、未使用ポートは自由に使えます。3306 など、ホスト側で既に何かのプロセスがポートを使用中であればエラーになります。ポートを重複して起動できないからです。

⑤コンテナ側のポート番号が固定だったとして、コンテナ側の.envファイルに定義するDB_PORTとも必ず合わせる必要があるのでしょうか(またはDB_PORTの定義は必ずしないといけないのか)。

アプリケーション次第ですが、一般的にはポートを一致させる必要があるでしょう。 DB_PORT のような記述も、アプリケーションやデータベース次第です。

多くの場合、デフォルト値が指定されているため、特にしていしなくても動く場合があります。明示しておけば、間違いありません。

投稿2021/04/10 22:40

zembutsu

総合スコア1584

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問