目次
はじめに
今回はNginxでLaravelを動作させるためにDocker上でNginx+PHP-FPM+MySQL環境を用意し、Laravelを動かす手順を紹介します。
ディレクトリ構成
1 2 3 4 5 6 7 8 9 10 11 12 |
docker-laravel-starter/ ├── Makefile ├── docker-compose.yml ├── docker/ │ ├── app/ │ │ └── Dockerfile │ ├── nginx/ │ │ └── nginx.conf │ └── php/ │ └── php.ini └── src/ |
ディレクトリ構成は上記の通りで各ファイルの説明をしていきます。
Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
.PHONY: up down build composer-install artisan # コンテナ起動 up: docker-compose up -d # コンテナ削除 down: docker-compose down # コンテナ作成 build: docker-compose build # webコンテナにssh接続 exec: docker-compose exec app bash # LaravelのCLIコマンドを実行 artisan: docker-compose run --rm app php artisan # Laravelプロジェクトを作成 (初回のみ実行、末尾で指定したバージョンのLaravelをインストール) init: docker-compose run --rm app composer create-project --prefer-dist laravel/laravel=11 . |
各コマンドの簡単な説明です。
- up/down: Dockerコンテナの起動・停止を実行
- build: Dockerイメージをビルド
- exec: appコンテナ内でbashコマンドを実行
- artisan: LaravelのArtisanコマンドを実行
- init: Laravelの新規プロジェクトを作成(初回のみ実行する想定)
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
services: app: build: context: ./docker/app container_name: laravel-app working_dir: /var/www/html volumes: - ./src:/var/www/html - ./docker/php/php.ini:/usr/local/etc/php/php.ini networks: - laravel depends_on: - mysql web: image: nginx:latest container_name: laravel-web ports: - "8080:80" volumes: - ./src:/var/www/html - ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf networks: - laravel depends_on: - app mysql: image: mysql:8.0 container_name: laravel-mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel MYSQL_USER: laravel MYSQL_PASSWORD: laravel volumes: - db_data:/var/lib/mysql networks: - laravel phpmyadmin: image: phpmyadmin:latest container_name: laravel-phpmyadmin ports: - "8081:80" environment: PMA_HOST: mysql MYSQL_ROOT_PASSWORD: root networks: - laravel volumes: db_data: networks: laravel: |
- app: PHP-FPMコンテナ。Dockerfileで必要なPHP拡張やComposerを導入するために使用しています
- web: Nginxコンテナ。ポート8080をコンテナ内の80番にマッピングし、Laravelのpublicディレクトリをドキュメントルートに指定しています
- mysql: MySQLコンテナ。DB名やユーザ名、パスワードを定義しました
- phpmyadmin: DB操作をGUIで行える便利なパッケージ、ポート8081をコンテナ内の80にマッピングしてアクセスできるように設定しています
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
FROM php:8.3-fpm # 必要な依存パッケージをインストール RUN apt-get update && apt-get install -y \ git \ unzip \ zip \ && apt-get clean # Composerをインストール RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # 作業ディレクトリを設定 WORKDIR /var/www/html |
- Composerをインストールして、Laravelのセットアップを容易にしました
- 作業ディレクトリを /var/www/html に設定しています
nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
server { listen 80; server_name localhost; root /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass app:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /\.ht { deny all; } } |
- ポートは80にしました
- root /var/www/html/public; でLaravelのpublicフォルダをルートに指定しています
- .phpファイルのリクエストは fastcgi_pass app:9000; を通じてPHP-FPMコンテナへアクセスできるようにしました
php.ini
1 2 3 4 |
memory_limit=512M upload_max_filesize=100M post_max_size=100M max_execution_time=300 |
このあたりは好みですが、初期設定より大きなファイルを扱うことを想定して設定を変更しました。
- 大容量ファイルを扱う際の制限値を引き上げています
- スクリプトの最大実行時間を300秒に設定しました
コンテナ起動とLaravel初期画面まで
Dockerイメージのビルド
1 |
make build |
Dockerコンテナの起動
1 |
make up |
docker-compose.ymlに定義された4つのコンテナ(app, web, mysql, phpmyadmin)を一斉に起動させます。appコンテナではPHP-FPMが稼働し、webコンテナがNginxの役割を担います。phpmyadminコンテナはGUIでDBを操作可能になります。
Laravelプロジェクトの新規作成
1 |
make init |
指定バージョンのLaravelが src 以下にインストールされます。初回実行時のみ必要な手順で、すでに実行済みの場合は省略可能です。
ブラウザで確認
http://localhost:8080 にアクセスしてLaravelの初期表示が表示されます。
http://localhost:8081 にアクセスすれば、phpmyadminが表示されます。
終わりに
以上がNginxでLaravelを動作させるためにDockerとNginx、PHP-FPM、MySQLを使ったLaravelのセットアップ手順です。
今までApacheは使ったことがありましたがNginxは使ったことがなかったため、ところどころ苦戦したものの、とてもよい経験になったと思います。みなさんも同じようなものが必要であればこちらを参考にしてください。