こんにちは、さるまりんです。
以前、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
を動かしたりといろんなパターンがあると思います。
たくさん試して詳しくなっていきたいと思います。
読んでくださってありがとうございました。
それではまた!