Laradock nginx postgres 環境構築編

こんにちは、Yuuichi(@WestHillWorker)です。

今回は、Laradockでpostgresとnginxで開発環境を構築しましたので、作業手順をまとめました。
個別のphpファイルからpostgresに接続、その後Laravelのプロジェクトからpostgresにマイグレーションできるところまでを目標とします。

スポンサーリンク

前提条件

・macOS環境
・docker for mac install済み

未インストールの方は、以下からインストールしましょう。
公式サイトDocker for Mac

laradockインストール

まずは、ローカルにlaradockのworkディレクトリを作成します。

$ cd ~
$ mkdir laravel_work #名前な任意
$ cd laravel_work
# Laradockをクローンする
$ git clone https://github.com/laradock/laradock.git
# git 管理削除
$ rm -rf ./laradock/.git
# 後で利用するプロジェクトのディレクトリを作成
$ mkdir web && mkdir rdb # 名前任意

.env設定ファイル編集

laradockディレクト直下で、postgresを利用できるように.envファイルの設定をtrueに変更します。

$ cp env-example .env
$ vim .env
# アプリケーションパス設定
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../web
- APP_CODE_PATH_CONTAINER=/var/www
+ APP_CODE_PATH_CONTAINER=/var/www/public
 APP_CODE_CONTAINER_FLAG=:cached
# データパスを設定
- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=../rbd
# postgresを利用するための設定
- WORKSPACE_INSTALL_PG_CLIENT=false
+ WORKSPACE_INSTALL_PG_CLIENT=true
- PHP_FPM_INSTALL_PGSQL=false
+ PHP_FPM_INSTALL_PGSQL=true
- PHP_FPM_INSTALL_PG_CLIENT=false
+ PHP_FPM_INSTALL_PG_CLIENT=true
- PHP_WORKER_INSTALL_PGSQL=false
+ PHP_WORKER_INSTALL_PGSQL=true
# ポート被らないようになおしておく
- NGINX_HOST_HTTP_PORT=80
- NGINX_HOST_HTTPS_PORT=443
+ NGINX_HOST_HTTP_PORT=8080
+ NGINX_HOST_HTTPS_PORT=8443
# 以下は任意で、PHPバージョン固定
- PHP_VERSION=7.2
+ PHP_VERSION=7.1
# XDEBUGを利用する場合
- WORKSPACE_INSTALL_XDEBUG=false
+ WORKSPACE_INSTALL_XDEBUG=true
- PHP_FPM_INSTALL_XDEBUG=false
+ PHP_FPM_INSTALL_XDEBUG=true

postgresバージョン指定

バージョンは都度変わらないように一旦指定しておく。

# PostgreSQLのバージョンを指定してインストール
$ vim postgres/Dockerfile
- FROM postgres:alpine
+ FROM postgres:9

nginx conf編集

.envで「APP_CODE_PATH_CONTAINER」で指定したパスにrootディレクトリ合わせておく。
特に変えてなければ、この編集は不要です。

# rootディレクトリ変更
$ vim nginx/sites/default.conf
-  root /var/www;
+ root /var/www/public;

コンテナ起動確認

laradock直下でコンテナ起動と、ブラウザアクセス確認。

# ちょっと時間かかります
$ docker-compose up -d --build workspace postgres php-fpm nginx
# 指定portsで StateがUpになっているか
$ docker-compose ps
           Name                          Command              State                      Ports
-----------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp
laradock_nginx_1              /bin/bash /opt/startup.sh       Up      0.0.0.0:8443->443/tcp, 0.0.0.0:8080->80/tcp
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp
laradock_postgres_1           docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
laradock_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp

postgre接続確認

簡易確認として、コンテナに入ってDB接続の確認とPHPファイルを配置して、接続ができているか確認してみましょう。

コンテナ接続チェック

コンテナに入って、DB接続してみる。

$ docker-compose exec --user=laradock workspace bash
$ psql -h postgres -U default
Password for user default: secret
# ユーザー一覧
default=# \du
                                        List of roles
      Role name      |                         Attributes                         | Member of
---------------------+------------------------------------------------------------+-----------
 default             | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
...
# データベース一覧
default=# \l
                                          List of databases
        Name         |  Owner  | Encoding |  Collate   |   Ctype    |        Access privileges
---------------------+---------+----------+------------+------------+---------------------------------
 default             | default | UTF8     | en_US.utf8 | en_US.utf8 |
…
# DBからExit
default=# \q

初期作成されるdefaultが存在したことは確認ができました。

PHP接続チェック

次にAPP_CODE_PATH_HOSTに指定したフォルダにphpファイルを配置して、DB接続してみましょう。

# APP_CODE_PATH_HOSTにindex.php作成
$ vim web/index.php

phpファイルは以下を記述する。

<?php
echo 'laradock test !!
';
$connection_string = "host=postgres dbname=default user=default password=secret port=5432";
$link = pg_connect($connection_string);
if ($link) {
  $db_name = pg_dbname($link);
  echo '接続に成功しました。
';
  echo '現在接続しているDBは' . $db_name . 'です。
';
} else {
  echo '接続に失敗しました。
';
}
$close_flg = pg_close($link);
if ($close_flg) {
  echo '切断に成功しました。
';
}

phpinfo();

ブラウザで、http://localhost:8080にアクセスしてみましょう。

↑こんな画面が表示されればOKです。

Laravelプロジェクト設定

次にLaravelプロジェクトでposgresを利用できるようにしてみましょう。

# Laravel プロジェクト作成
$ composer create-project --prefer-dist laravel/laravel testpj
$ cd laradock
# アプリケーションコードとコンテナのパスを修正
$ vim .env
APP_CODE_PATH_HOST=../testpj
# Point to where the `APP_CODE_PATH_HOST` should be in the container
APP_CODE_PATH_CONTAINER=/var/www/testpj
# nginx コンフも修正
$ vim nginx/sites/default.conf
root /var/www/testpj/public;

一旦コンテナ再作成して、ブラウザで確認してみる。

$ docker-compose down
$ docker-compose up -d workspace postgres php-fpm nginx

ブラウザで、http://localhost:8080にアクセスしてみましょう。

↑こんな画面が表示されればOKです。

Laravelの接続先変更

デフォルトはmysqlに設定されているため、postgresに変更してマイグレーションしてみましょう。

.env修正

mysqlからpgsqlに設定ファイルを書き換えましょう。

# laravelで作成した.envを修正
$ vim testpj/.env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

マイグレーション

マイグレーションしてlaravelからposgres接続確認します。

# Laravelプロジェクト直下で以下を実行
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

マイグレーション成功したみたいなので、DB入って確認してみましょう。

$ cd laradock
$ docker-compose exec --user=laradock workspace bash
laradock@62f0d14417b9:/var/www$ psql -h postgres -U default
Password for user default:
psql (10.7 (Ubuntu 10.7-1.pgdg16.04+1), server 9.6.12)
Type "help" for help.
# usersなどのテーブル生成されていた!
default=# \d
                List of relations
 Schema |       Name        |   Type   |  Owner
--------+-------------------+----------+---------
 public | migrations        | table    | default
 public | migrations_id_seq | sequence | default
 public | password_resets   | table    | default
 public | users             | table    | default
 public | users_id_seq      | sequence | default
(5 rows)
default=# select * from users;
 id | name | email | email_verified_at | password | remember_token | created_at | updated_at
----+------+-------+-------------------+----------+----------------+------------+------------
(0 rows)
default=# \q

マイグレーションもうまくできていることが確認できました!!
この後は、作りたいアプリケーションを作っていく形になると思いますので、今回はここまでで完了です!!

まとめ

mysql使うことが多いのですが、postgreを利用する時のため、色々調べながら作成してみました。
nginxの設定と.envの設定を間違えたりすると404 not foundになったりしてしまうので、その辺りは要注意です。
laradockを使えば、必要なものを設定するだけなので、すごく便利だなと思いました。