こんにちは、さるまりんです。
以前、Dockerでパパッとデータベースを準備する方法を書きました。
今回はNginx+Laravelの開発環境を作ってみます。
Dockerで開発環境を作るのには、2つのファイルDockerfileとdocker-compose.ymlを作成します。
それぞれどんなファイルかを思いっきりざっくりと。
docker-compose.ymlにはどんな環境を作成するかを記述し、Dockerfileにはその環境が作成されるときの手順を記述します。
ざっくりすぎてわからないですね。
実際にタイトルの環境を作るためのファイルで見ていきます。
Nginxを動作させる。
まずは開発環境を置くディレクトリを作成します。
mkdir docker-laravel
作成したディレクトリに移動します。
cd docker-laravel
このディレクトリに次の構成で作成していきます。
.
├── docker
│ └── conf
│ └── default.conf
├── docker-compose.yml
└── index.html
docker-compose.ymlにNginxの情報を記述します。
version: '3'
services:
web:
image: nginx:1.21.6
ports:
- '8000:80'
volumes:
- ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
色々設定が書いてありますね。
services欄のwebがコンテナの名前で、そこにnginxを置くことを示しています。1.21.6はdockerhubにあるNginxのイメージのバージョンです。
portsはホスト側のポート8000にアクセスすると、作成されるnginxのポート80にアクセスできるようになる指定です。
volumes欄では
./docker/conf/default.confを作成される環境の/etc/nginx/conf.d/default.conf
現在のディレクトリ(./docker-laravel)を作成される環境の/var/www/html
とする指定をしています。
default.confはNginxの設定ファイルです。
server {
listen 80;
root /var/www/html;
index index.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
最低限の設定です。Nginx webサーバのリクエストはポート80で受けます。rootとindexでドキュメントルートとディレクトリ・インデックス名を設定、access_logとerror_logでログの出力先を指定しています。
表示するためのindex.htmlも用意します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>index</title>
</head>
<body>
<h1>トップページ</h1>
<p>docker-composeで作成したlaravel環境トップです。</p>
</body>
</html>
これで次のコマンドを実行します。
docker-compose up -d
これが成功し、ブラウザでhttp://127.0.0.1:8000/にアクセスすると次のように表示されます。

これでDockerでNginx環境は出来ました。
NginxでPHPを動作させる。
次はPHPを動かします。
docker-compose.ymlを編集してservicesにphpを追加して動作させるPHPを指定、web欄にも設定を追加します。
version: '3'
services:
web:
image: nginx:1.21.6
ports:
- '8000:80'
depends_on:
- php
volumes:
- ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
php:
image: php:8.1.4-fpm
volumes:
- .:/var/www/html
Nginxの設定もPHPを動作させることができるように編集します。
server {
listen 80;
root /var/www/html;
index index.php index.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
上の設定の中で/にアクセスされた時にindex.phpを優先的に表示するようにしたので、PHP版のindex、index.phpを作成します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>index</title>
</head>
<body>
<h1>トップページ(PHP)</h1>
<p><?php echo "docker-composeで作成したlaravel環境トップです。";?></p>
</body>
</html>
先ほどと同じくdocker-compose up -dで立ち上げて、http://127.0.0.1:8000/にアクセスすると次のように表示されます。
※ Nginxの環境を作ったときのまま動いている状態であれば一度docker-compose downで停止してから再度docker-compose up -dで立ち上げてください。

PHPも動くようになりました。
Laravelをインストールする。
Laravelはcomposerというパッケージ管理システムを利用します。環境作成時にそれを行うための設定をDockerfileに記述します。
docker/phpディレクトリを作成し、そこにDockerfileを作成します。
現在のファイル・ディレクトリ構成はこんな感じです。
.
├── docker
│ ├── conf
│ │ └── default.conf
│ └── php
│ └── Dockerfile
├── docker-compose.yml
├── index.html
└── index.php
docker-compose.yml
version: '3'
services:
web:
image: nginx:1.21.6
ports:
- '8000:80'
depends_on:
- php
volumes:
- ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
- .:/var/www/html
php:
build: ./docker/php
volumes:
- .:/var/www/html
servicesのphp欄でimageの代わりに、buildでDockerfileがあるディレクトリを指定して、そのDockerfileにどんな環境を作成するかを定義します。
Dockerfile
FROM php:8.1.4-fpm
RUN cd /usr/bin && curl -s https://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y git zip unzip vim
WORKDIR /var/www/html
FROMでどのイメージ(どのPHPを使うか)をRUNで実行するコマンド(composerなどをインストールする手順)を記述しています。WORKDIRはコマンドを実行するときどのディレクトリで行うのかを指定しています。
これでdocker-compose up -dで立ち上がると、作成された環境でcomposerを利用してLaravelプロジェクトを作成することができます。
立ち上がったPHPの環境(PHPのコンテナ)に入る。
docker-compose exec php bash
my-appプロジェクトを作成する。
composer create-project --prefer-dist laravel/laravel my-app
このコマンドが成功するとmy-appディレクトリが作成され、その配下にLaravelプロジェクトのファイル群が作成されます。
.
├── docker
│ ├── conf
│ │ └── default.conf
│ └── php
│ └── Dockerfile
├── docker-compose.yml
├── index.html
├── index.php
└── my-app
└─ (Lavavelプロジェクト)
Nginxの設定を編集する。
Laravelアプリケーションは全てのリクエストを[プロジェクトのディレクトリ/public/index.php]に渡す必要があるのでその設定をします。
server {
listen 80;
root /var/www/html/my-app/public;
index index.php index.html;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
rootでドキュメントルートのディレクトリの指定を/var/www/html/my-app/publicに変更しています。
これでdocker-compose up -dで再度立ち上げ(必要に応じてdocker-compose downしてから)、http://127.0.0.1:8000/にアクセスすると次のように表示されます。

Laravelの初期画面が表示されました!
実際はここにMySQLやPostgreSQLのデータベースを追加したり、redisやmemcachedを動かしたりといろんなパターンがあると思います。
たくさん試して詳しくなっていきたいと思います。
読んでくださってありがとうございました。
それではまた!