以前にDockerとApache環境でのLaravelの構築手順を書きました。
先日にnginxの静的ページの構築をまとめましたが、今回はPHP環境も入れてLaravelが起動出来る所まで記載します。
なお今回はデータベースについては省き、単純に起動するところまでとします。
(DBは特に変わったところは無いので)
0. 環境
- macOS Mac Sonoma 14.6.1
- Docker 27.2.0
- Docker Compose v2.29.2-desktop.2
- Laravel 11
- PhpStorm 2024.2.3
- nginx 1.27.1
1. ディレクトリ構成
ファイル構成は以下となります。
「nginx」と「php」とそれぞれの設定ファイルを作成します。
/
├── .docker/
│ ├── logs/ # ログファイルを見えるようにする
│ │ └── example.com # ドメインごとにログファイルを設定
│ ├── nginx/
│ │ ├── conf.d/ # サーバ名とルートディレクトリを設定
│ │ │ └── example.com.conf
│ │ ├── Dockerfile
│ │ └── nginx.conf
│ ├── php/
│ │ ├── conf.d/ # サーバ名とルートディレクトリを設定
│ │ │ └── example.com.conf
│ │ ├── Dockerfile
│ │ └── php.ini
│ │ └── docker-php-ext-xdebug.ini
└── docker-compose.yml
2. nginx側のDockerfile の記述
まずはnginx側の「Dockerfile」を作成し、以下のように記述します。
FROM nginx:1.27.2-alpine
# Japanese
ENV TZ=Asia/Tokyo
# Install packages
RUN set -eux \
apk update -qq && apk upgrade -qq && apk add --no-cache
# ADD nginx config
ADD ./.docker/nginx/nginx.conf /etc/nginx/nginx.conf
ADD ./.docker/nginx/conf.d/default.conf /etc/nginx/conf.d/example.conf
3. nginx.conf の記述
次に「nginx.conf」を作成し、以下のように記述します。
以前に設定した内容からは大きく変わっていません
pid /var/run/nginx.pid;
worker_processes auto;
events {
worker_connections 400875;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
sendfile on;
# UTF-8を使用する
charset UTF-8;
# サーバ名を非表示にする
server_tokens off;
# アップロード可能なファイルサイズの上限を設定
client_body_buffer_size 10M;
client_max_body_size 10M;
# バッファサイズの設定
proxy_buffer_size 64k;
proxy_buffers 100 64k;
proxy_busy_buffers_size 128k;
# gzip圧縮の設定
gzip on;
gzip_http_version 1.0;
gzip_types text/plain text/css text/javascript application/javascript application/x-javascript application/x-httpd-php application/json application/font-sfnt application/font-woff image/x-icon;
# ログファイルの設定
# ログファイルのフォーマットをjson形式に設定
log_format json escape=json '{'
'"time":"$time_iso8601",'
'"host":"$remote_addr",'
'"port":"$remote_port",'
'"method":"$request_method",'
'"uri":"$request_uri",'
'"status":"$status",'
'"body_bytes":"$body_bytes_sent",'
'"referer":"$http_referer",'
'"ua":"$http_user_agent",'
'"request_time":"$request_time",'
'"respons_time":"$upstream_response_time"'
'}';
# 40x系のログを出力するための変数を設定
map $status $res_status_4xx {
~^[4] 1;
default 0;
}
# 50x系のログを出力するための変数を設定
map $status $res_status_5xx {
~^[5] 1;
default 0;
}
# access.logにjson形式で出力
access_log /var/log/nginx/access.log json;
# エラーログを出力
access_log /var/log/nginx/error4xx.log json if=$res_status_4xx;
access_log /var/log/nginx/error5xx.log json if=$res_status_5xx;
error_log /var/log/nginx/error.log info;
# include
include /etc/nginx/conf.d/*.conf;
}
4. nginx.d/example.conf の記述
次にサイトごとの設定ファイルを作成します。
ここにLaravelのURLに対応出来るように設定するようになります。
server {
listen 80;
server_name example.com;
root /app/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
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 app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
これでまずはnginx側の設定が出来ました。
次にPHP側の設定を行っていきます。
5. php側のDockerfile の記述
次にPHP側の「Dockerfile」を作成し以下のように記述します。
FROM php:8.3-fpm
ENV TZ Asia/Tokyo
ARG BUILD_ENV=prod
RUN apt-get update -qq && \
apt-get upgrade -qq && \
apt-get install -y git unzip libzip-dev libicu-dev libonig-dev >/dev/null && \
docker-php-ext-install intl pdo_mysql mbstring zip bcmath opcache >/dev/null && \
pecl install xdebug && \
apt-get clean && \
:
COPY ./.docker/php/php.ini /usr/local/etc/php/php.ini
COPY --from=composer:2.4.3 /usr/bin/composer /usr/bin/composer
WORKDIR /app
6. php.ini の記述
次に「php.ini」を作成し、以下のように記述します。
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[Assertion]
zend.assertions = -1
[mbstring]
mbstring.language = Japanese
7. xdebugに対応出来るように設定
xdebugでデバッグ出来るように「docker-php-ext-xdebug.ini」を作成し、以下のように記述します。
[xdebug]
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host = host.docker.internal
xdebug.client_port=9003
8. docker-compose.yml の記述
最後に「docker-compose.yml」を作成し、以下のように記述します。
各それぞれのコンテナごとにdockerfileを設定して作成します。
services:
# PHP Service
app:
build:
context: .
dockerfile: ./.docker/php/Dockerfile
volumes:
- ./src/:/app
- ./.docker/logs/php:/var/log/php
- ./.docker/php/docker-php-ext-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# Nginx Service
web:
build:
context: .
dockerfile: ./.docker/nginx/Dockerfile
ports:
- "9083:80"
depends_on:
- app
volumes:
- ./src/:/app
- ./.docker/logs/nginx:/var/log/nginx
9. コンテナの立ち上げ
ターミナルを起動して「docker-compose.yml」があるディレクトリで以下のコマンドを実行します。
docker-compose up -d
10. Laravelのインストール
コンテナが立ち上がったら、コンテナに入ってLaravelをインストールします。
以下のコマンドでコンテナに入る事が出来ます。
docker-compose exec -it app bash
次にコマンドからLaravelをインストールします。
composer create-project --prefer-dist laravel/laravel .
11. ブラウザで確認
Laravelのインストールが完了したら、ブラウザを起動して http://localhost:9083 にアクセスして確認します。
Laravelの画面が表示されたら、まずは成功です。
このまま開発が進められるようになりますが、記事が長くなったので次回にPhpStormでデバッグするようにします。