たいきゅんの日記

ITエンジニアの積み上げ日記

Laravel+Nginx+PostgreSQLのDocker環境を作成する-コンテナ立ち上げまで-

 

こんにちは。たいきゅんです。

 

転職して最初の案件が新規案件で、当たり前のようにDockerを使うことになりました。

そこで改めてDockerの基礎について学習したのでまとめてみます。

 

最低限の設定で動くようにしてみています。

内容は初心者レベルですので、ポートフォリオ作成でDockerを使いたいという方は参考にして頂けると幸いです。

設定を細かく書く形ですので、基礎理解を深めたい方向けになっております。

また今回はコンテナの立ち上げまでをまとめております。次回の記事で以後の設定も記載します。

 

1. 今回作成する環境の要件

今回はLaravel環境を作成してみました。作成するコンテナは以下の3つです。

 

  1. Laravelコンテナ(PHP fpm)
  2. nginxコンテナ(プロキシ)
  3. PostgreSQLコンテナ

 

(PHP-fpmについては別途記事を作成してますのでそちらを参考に)

バージョンは基本的に記事作成時(20228月時点)の最新版で作成してます。

 

Nginx 1.23.1

Laravel Framework 9.25.1

PostgreSQL 14.4

 

2. フォルダ構造と実際に作成したDockerfile・docker-compose.yml

 

フォルダ構成は今回下記の形を使ってみました。

docker-compose.ymlを修正してお好みの形に編集して頂ければと思います。

 

.tree

.
├── docker
│   ├── laravel
│   │   ├── Dockerfile
│   │   └── settings
│   │   └── php.ini
│   ├── nginx
│   ├── Dockerfile
│   └── settings
│   └── default.conf
├── docker-compose.yml

 

docker/laravel/Dockerfile

FROM php:8.0-fpm

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY ./settings/php.ini /usr/local/etc/php/php.ini

RUN apt-get update && apt-get install -y libpq-dev nodejs git zip unzip \
&& docker-php-ext-install pdo_pgsql

RUN pecl install xdebug \
&& docker-php-ext-enable xdebug

WORKDIR /var/www/app

 

docker/nginx/Dockerfile

FROM nginx:1.23.1-alpine

COPY ./settings/default.conf /etc/nginx/conf.d/default.conf

 

docker-compose.yml

version: '3.8'
services:
app:
build: ./docker/laravel
volumes:
- ./laravel:/var/www/app
- 9000:9000

nginx:
build: ./docker/nginx
- 80:80
volumes:
- ./laravel:/var/www/app
db:
image: postgres:latest
environment:
TZ: Asia/Tokyo
POSTGRES_DB: test
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
- 5432:5432

volumes:
postgres_data:
driver: local
 
3. それぞれの設定項目の説明
 
それぞれのファイルの設定項目をまとめます。
1. docker/laravel/Dockerfile
FROM php:8.0-fpm
php-fpmの8.0をイメージに設定しています。
 
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
composerインストールの部分です。
composerの設定箇所は決まっているので、上記で問題ないはずです。
 
COPY ./settings/php.ini /usr/local/etc/php/php.ini
php.iniファイルをdocker環境にセットしています。
php.iniではxdebugを実行するための設定を記載しました。(本記事では割愛)
 
RUN apt-get update && apt-get install -y libpq-dev nodejs git zip unzip \
&& docker-php-ext-install pdo_pg
必要な機能を諸々apt-get installしています。

今回は、laravelで必要になるnode、postgresqlとの接続に必要なlibpq-dev pdo_pg 、composer実行時に必要なzip,unzip,gitを選択しています。

 
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug
xdebugのインストールと実行できるように設定
 
WORKDIR /var/www/app
今回は/var/www/appにlaravelをダウンロードしたいため、WORKDIRを設定しました。
これがあると、laravelコンテナに入った際の最初の作業位置が/var/www/appになります
 
2. docker/nginx/Dockerfile
FROM nginx:1.23.1-alpine
作成当時の最新バージョンを設定。
 
COPY ./settings/default.conf /etc/nginx/conf.d/default.conf
動かすことだけ考えると、default.confの設定のみで十分なので/settings/default.confファイルをCOPYする形にしました。
 
3. docker-compose.yml
 
Laravelコンテナ
services:
app:
build: ./docker/laravel
volumes:
- ./laravel:/var/www/app
- 9000:9000
 
buildセクションで、buildに使用するDockerfileを指定しています。
またvolumeセクションで、laravelフォルダと、コンテナ内の/var/www/appがvolumeするように設定しています。
portsはなくても確か動きますが、明示したかったため設定しました。今回はphp-fpmデフォルトの9000番を設定してます。
 
nginxコンテナ
nginx:
build: ./docker/nginx
- 80:80
volumes:
- ./laravel:/var/www/app
 
buildセクションで、buildに使用するDockerfileを指定しています。
プロキシ設定するため、volumeセクションでlaravelコンテナと同様の設定をしています。
portsはなlaravelコンテナ同様、明示したかったためnginxデフォルトの80番を設定してます。
 
dbコンテナ
db:
image: postgres:latest
environment:
TZ: Asia/Tokyo
POSTGRES_DB: test
POSTGRES_USER: admin
POSTGRES_PASSWORD: password
- 5432:5432

volumes:
postgres_data:
driver: local
 
imageセクションで、PostgreSQLの最新版をimageに設定しています。
TZは時間設定のための設定です。
POSTGRS_DBはデータベース作成時に自動で作成されるdb名を設定しています。今回はtestというデータベースを作成する形にしてみました。
POSTGRS_USERは、データベース作成時に自動で作成されるユーザー名を設定しています。今回はadminユーザーを作成する形にしてみました。
POSTGRS_PASSPORDデータベース作成時に自動で作成されるユーザーのパスワードの設定しています。今回はpasspordというパスワードを設定してみました。
 
volumesで、データの永続化の設定をしています。
この記述がないと、DBに登録したデータがコンテナを停止させると同時に消えてしまいますので注意してください。
 
4. nginx.confの設定
今回はnginxをプロキシサーバーとして使用したいため、その設定が必要です。そのためにはnginxコンテナに設定を書かないといけないのですが、それを今回はnginx.confファイルに記載しました。こちらを紹介します
 
docker/nginx/settings/default.conf
server {
listen 80;
root /var/www/app/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}
 
それぞれ説明していきます
listen 80;
root /var/www/app/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
listen: 80番ポートをlistenさせます。
root: ルートフォルダを設定します。laravelの場合は、publicがルートフォルダになるので、コンテナ内でのパス(/var/www/app/public)を設定しました。
index: 最初に読み込むファイルを設定します。laravelの場合は、public/index.phpを最初に読み込む必要があるので、そちらを設定します。
location: ファイルの振り分けの設定をしています。urlの設定があれば、そのURLにプロキシし、なければindex.php?$query_string....という形でプロキシするという設定にしています。
 
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
php-fpmの設定が必要なので、頭文字にfstcgiとついています。
pass: phpコンテナのパスを設定します。ここは、コンテナ名:ポート名と設定します。
param: サーバーに渡すパラメーターを設定します。詳細は省略しますが、上記設定でパラメータを渡すことができました。
include: パラメーターをincludeできるように設定しています
 
参考

PHP FastCGI の例 | NGINX

 

4. docker-compose コマンドで立ち上げ

設定が完了したら、docker-composeコマンドでコンテナを立ち上げられるはずです。

長くなったのでDB設定や、laravelのダウンロードは次回以降記載します。

 

今回の記事は以上となります。

LaravelのインストールとDB接続は次の記事に記載しておりますので是非参考にしてください。

最後まで読んで頂きありがとうございました!!