こんにちは、ニキです。
この記事はこんな方におすすめです。
- Docker+PHP-FPMでさくっとLaravelの開発環境構築したい
- Docker+Nginx+MySQL+PHP-FPMで本番環境を想定したLaravelの開発環境構築をしたい
今回の記事では、docker composeを使って環境構築方法を解説します。初めに、PHP-FPMだけをつかって簡単な方法を解説した後に、Docker+Nginx+MySQL+PHP-FPMを使った方法を解説します。
環境情報
- Chip: Apple M1
- macOS: Ventura 13.2.1
- Docker: 20.10.22
コンテナ上の環境情報
- Laravel: 10.16.1
- PHP: 8.2.8
- Nginx: 1.25.1
- MySQL: 8.0.34
ディレクトリ構成
.
├── compose.yaml
├── mysql
│ ├── data
│ └── my.cnf
├── nginx
│ └── default.conf
└── php
├── Dockerfile
└── src
Docker+PHP-FPMでLaravelの開発環境構築
まずはPHP-FPMコンテナだけで開発環境の構築をします。
Dockerfileの作成
Dockerfileを以下のように作成します。
FROM php:8.2.8-fpm-alpine3.18
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN docker-php-ext-install pdo_mysql
1行ずつ説明します。まず、FROMです。
FROM php:8.2.8-fpm-alpine3.18
執筆時点での最新バージョンを指定しています。軽量化のためにaplineイメージを使用しています。本番環境では公式イメージの利用を推奨します。
次に、COPYです。
COPY --from=composer /usr/bin/composer /usr/bin/composer
—from=composer
でマルチステージビルドを使用しています。
ComposerのDocker Hubのページでもこの方法が推奨されています。
引用 https://hub.docker.com/_/composer
- (optimal) create your own build image and install Composer inside it.
Note: Docker 17.05 introduced multi-stage builds, simplifying this enormously:COPY --from=composer /usr/bin/composer /usr/bin/composer
COPY --from=
を説明しているリファレンスも載せておきます。
引用 https://docs.docker.com/engine/reference/builder/#copy
- Optionally a name can be given to a new build stage by adding
AS name
to theFROM
instruction. The name can be used in subsequentFROM
andCOPY --from=<name>
instructions to refer to the image built in this stage.
簡潔に書けるだけでなく、Composerのアップデートのたびにハッシュ値を変更しなくてすみます。
WARNING: Please do not redistribute the install code. It will change with every version of the installer. Instead, please link to this page or check how to install Composer programmatically.
引用 https://getcomposer.org/download/
最後に、RUN docker-php-ext-install
です
RUN docker-php-ext-install pdo_mysql
RUN
: コマンドを実行します。ここでのコマンドはdocker-php-ext-install
です。docker-php-ext-install
: PHPイメージで提供されている便利なスクリプトで、PHPの拡張モジュールをインストールできます。ここでの拡張モジュールはpdo-mysql
です。pdo-mysql
: LaravelがPDOを使ってMySQLへアクセスするため、このモジュールが必要です。
compose.yamlの作成
compose.yamlを以下のように作成します。
services:
app:
build:
context: ./php
dockerfile: Dockerfile
container_name: php
ports:
- 8000:8000
volumes:
- ./php/src:/var/www/html/example
コンテナの作成・起動
コンテナを作成するために、compose.yamlと同じディレクトリで以下を実行します。
% docker compose up -d
コンテナの一覧が以下のように表示されます。
% docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
php tmp-app "docker-php-entrypoi…" app 7 seconds ago Up 4 seconds 0.0.0.0:8000->8000/tcp, 9000/tcp
Laravelプロジェクトの作成
コンテナに入ります。
% docker compose exec app ash
“example”というLaravelプロジェクトを作成します。
# composer create-project laravel/laravel example
ビルトインサーバーを起動します。
# cd example
# php artisan serve --host 0.0.0.0
http://localhost:8000
へアクセスして、以下のように表示されれば正常に動作しています。

Docker+Nginx+MySQL+PHP-FPMでLaravelの開発環境構築
次にPHP-FPMだけでなく、本番環境を想定した構成で開発環境を構築します。
Nginxの設定
default.confを作成します。
server {
listen 80;
listen [::]:80;
server_name localhost;
root /var/www/html/example/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \\.php$ {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\\.(?!well-known).* {
deny all;
}
}
各ディレクティブについては以下記事で解説しています。
MySQLの設定
MySQLの設定ファイルのmy.cnfを作成します。
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
[client]
default-character-set = utf8mb4
MySQLの環境構築については以下の記事で解説しています。
compose.yamlの修正
compose.yaml を以下のように修正します。
services:
app:
build:
context: ./php
dockerfile: Dockerfile
container_name: php
volumes:
- ./php/src:/var/www/html/example
web:
image: nginx:1.25.1-alpine-slim
container_name: nginx
ports:
- 8080:80
volumes:
- ./php/src:/var/www/html/example
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
db:
image: mysql:8.0.34
container_name: mysql
ports:
- 3306:3306
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Tokyo
volumes:
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- MYSQL_DATABASE: ここで”laravel”を指定するとlaravelという名前でデータベースを作成してくれます。アプリケーションで使用するDBを作成する必要があるので、ここで設定しておきます。
コンテナの再作成・起動
コンテナを削除し、再度作成するために、compose.yamlと同じディレクトリで以下を実行します。
% docker compose down
% docker compose up -d
コンテナの一覧が以下のように表示されます。
% docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
mysql mysql:8.0.34 "docker-entrypoint.s…" db 7 seconds ago Up 6 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp
nginx nginx:1.25.1-alpine-slim "/docker-entrypoint.…" web 7 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp
php tmp-app "docker-php-entrypoi…" app 7 seconds ago Up 6 seconds 9000/tcp
http://localhost:8080
へアクセスして、先ほどと同様の表示されれば正常に動作しています。
まとめ
docker composeを使って以下の2種類のニーズに応えられるように環境構築方法を解説しました。
- Docker+PHP-FPMでさくっとLaravelの開発環境構築したい
- Docker+Nginx+MySQL+PHP-FPMで本番環境を想定したLaravelの開発環境構築をしたい
続いて、必要な初期設定については以下の記事で解説しています。
Laravel BreezeとNext.jsを使ったフロントエンドとの認証方法については、以下の記事で解説しています。