【Laravel】Docker for WindowsでLaradock(+PostgreSQL)に挑戦してみた。

はじめに

PostgreSQLではポート被りの問題を解消できず、環境構築できておりません。備忘録です。

5/19追記:永続化はできていませんが一応起動することはできました。以下記事にまとめています。

「Laravel(+Vue.js)でSNS風Webサービスを作ろう!」をWindows+Laradock(PostgreSQL)でやってみた

また、MySQLでは環境構築ができており、以下の記事でまとめていますので参考にしていただければ幸いです。
(PostgreSQLの環境構築に挑戦したことで理解が深まりMySQLで環境構築&アプリ制作までできました。)

Docker for WindowsでLaradock(+MySQL)の環境構築

環境構築

Laradockを新しくインストールするディレクトリを作成。

$ mkdir laravel-sns
$ cd laravel-sns

Laradockをインストール。

$ git clone https://github.com/Laradock/laradock.git -b v9.6

Laradockの.envファイルを作成

$ cd laradock
$ cp env-example .env

.envファイルを編集

APP_CODE_PATH_HOST=../
DATA_PATH_HOST=~/.laradock/data
COMPOSE_PROJECT_NAME=laradock

APP_CODE_PATH_HOST=../laravel #laravelのプロジェクトファイル名に書き換え
DATA_PATH_HOST=../data #複数データを参照してしまう可能性があるため
COMPOSE_PROJECT_NAME=laravel-sns #dockerのコンテナ名を変更

laradock/postgresディレクトリにあるDockerfileの1行目を修正してバージョン指定

FROM postgres:11.6

ソフトウェア本体となるDockerイメージをダウンロードして、コンテナ起動(ダウンロードは初回のみ)

$ cd ~/laravel-sns/laradock
$ docker-compose up -d workspace php-fpm nginx postgres

完了

※WARNINGは【警告:サービスnginxのイメージは、まだ存在しなかったために作成されました。 このイメージを再構築するには、「docker-compose build」または「docker-compose up –build」を使用する必要があります。】とのこと。

Laravelのインストール (docker-composeコマンドは今後もlaradockディレクトリで実行するようにする。)

$ docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "6.8.*"

Application key set successfullyと表示されたらhttp://localhost/へアクセス。

簡単に表示されました◎

アプリ制作

コントローラー作成

Laradockディレクトリでコマンド実行すること!!

$ docker-compose exec workspace php artisan make:controller ArticleController

データベース作成

psqlでデータベースを作ることを試みるが失敗。

$ docker-compose exec workspace psql -U default -h postgres
psql: could not translate host name "postgres" to address: Name or service not known

以下で起動できていないことが判明!!(その後再起動しても変わらず。)doneなっててもあてにしてはいけないらしい。。。

$ docker-compose ps
             Name                           Command              State                     Ports
------------------------------------------------------------------------------------------------------------------
laravel-sns_docker-in-docker_1   dockerd-entrypoint.sh           Up       2375/tcp, 2376/tcp
laravel-sns_nginx_1              /bin/bash /opt/startup.sh       Up       0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
laravel-sns_php-fpm_1            docker-php-entrypoint php-fpm   Up       9000/tcp
laravel-sns_postgres_1           docker-entrypoint.sh postgres   Exit 1
laravel-sns_workspace_1          /sbin/my_init                   Up       0.0.0.0:2222->22/tcp

laradockの.envファイルを以下に編集してみるも変わらず。

# DATA_PATH_HOST=~/.laradock/data
DATA_PATH_HOST=../db # プロジェクト内を指定する
POSTGRES_PORT=5433 #ポート番号の変更

laradock/postgresディレクトリにあるDockerfileのボート番号も修正。

EXPOSE 5433

実行するも変わらないので、ホストをlocalhostに変えて実行。

$ docker-compose exec workspace psql -U default -h localhost
psql: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?

イメージを作成した際に5432にしていたので、後々変更しても5433には変わらないのかも。。。

以前インストールしたPostgreSQLのポートを変更 C:\PostgreSQL\12\dataディレクトリにあるpostgresql.confを変更するも変わらず。

port = 5433

試しにポートが何に使われているか調べてみる。

$ netstat -nao

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:135            0.0.0.0:0              LISTENING       1296
  TCP         0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP         0.0.0.0:2179           0.0.0.0:0              LISTENING       7424
  TCP         0.0.0.0:5040           0.0.0.0:0              LISTENING       9220
  TCP         0.0.0.0:5432           0.0.0.0:0              LISTENING       8504 #これが犯人っぽい!!

タスクマネージャーを起動してタスクを終了。変わらない。

サービスの停止。変わらず。

仕方ないので一度アンインストール。変わらない。泣

C:\Program Files\PostgreSQL\12\uninstall-postgresql.exe

注意されていたイメージを構築。変わらず。

$ docker-compose up --build

とりあえず一旦おいてマイグレーションできるかダメもとでチェックするため、laravelディレクトリ側の.envファイルを編集。

DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=larasns
DB_USERNAME=default
DB_PASSWORD=secret

テーブル作成。作成できる。

$ docker-compose exec workspace php artisan make:migration create_articles_table --create=articles
Created Migration: 2020_03_24_153153_create_articles_table

マイグレーションは失敗。DBができてないんだから当たり前だよね。。。泣

$ docker-compose exec workspace php artisan migrate

Illuminate\Database\QueryException : SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name or service not known (SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE')

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

Exception trace:

1 PDOException::("SQLSTATE[08006] [7] could not translate host name "postgres" to address: Name or service not known")
/var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

2 PDO::__construct("pgsql:host=postgres;dbname=larasns;port=5432;sslmode=prefer", "default", "secret", [])
/var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

Please use the argument -v to see more details.

以下でポートが使われていないことは確認。

$ netstat -nao

laradockの.envに以下の1行を追加。

DB_HOST=postgres

laravelの.envを見直し。

DB_DATABASE=default

ダメ元チェック失敗。

$ docker-compose exec workspace psql -U default -h postgres
psql: could not translate host name "postgres" to address: Name or service not known

1からコンテナを作り直すべきか。。。

コンテナ作り直してトライ

コンテナにコピーした設定ファイルの改行コードがCRLFになっているため(コンテナはLinuxベースなので改行コードがLFである必要がある)カレントフォルダ以下のファイルをCRLFからLFに一括変換

$ cd postgres/docker-entrypoint-initdb.d
$ find * -type f -exec sed -i "s/\\r\\n/\\n/g" {} \;

docker-compose up前にPostgresディレクトリのDockerfileのEXPOSEも54320に変更してからコマンド実行するも失敗。

$ docker-compose ps 
laravel-sns2_postgres_1 docker-entrypoint.sh postgres Exit 1

PostgreSQLが最後まで起動できず。DBも作れないのでマイグレーションできない。

docker-compose.ymlを編集してみるも失敗。

### PostgreSQL #####
ports:
# - "${POSTGRES_PORT}:5432"
  - "${POSTGRES_PORT}:54320"

 

最後に

かなり格闘しましたがPostgreSQLを最後まで起動できず。

引き続き挑戦するので都度更新していきます。。。

参考にした教材

Laravel(+Vue.js)でSNS風Webサービスを作ろう!
https://www.techpit.jp/p/laravel-vue-sns

参考サイト

LaradockでPostgreSQLを起動できないときの対処法
https://shigu493.com/laradock%E3%81%A7postgresql%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/

あるポート番号が何のアプリケーションで使用されているか調べる方法
https://www.projectgroup.info/tips/Windows/comm_0133.html

Laradockを用いてDocker + CentOS + Apache + PHP7 + PostgreSQLな環境を作る
https://qiita.com/rema424/items/ba6e6f440c415fed7b0c

Windows 10でDocker + Laravel環境構築
https://qiita.com/de_teiu_tkg/items/bd9df11c981b966a0c3e

LaravelでPostgreSQLを使うための設定メモ
https://qiita.com/aminevsky/items/52f56546f081c52b79ed

コメントを残す