はじめに
卒業研究でlaravelを使用することになったため、docker composeでデバック環境を構築してみました。
より良い書き方や間違いがあれば、ぜひ教えていただけると嬉しいです!
環境
Laravel11
PHP8
最新版のNginx
最新版のPostgreSQL
最新版のXdebug
ディレクトリ構成
project-root/
├── docker-compose.yml
├── php/
│ ├── Dockerfile
│ ├── php.ini
│ └── xdebug.ini
├── nginx/
│ └── default.conf
└── src/
└── (Laravelプロジェクトがここに作成されます)
Nginxの設定 (default.conf)
server {
listen 80;
server_name localhost;
root /var/www/work/public;
index index.php index.html index.htm;
# Laravelのフロントコントローラへのリクエストを転送
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHPファイルの処理
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass app:9000; # PHP-FPMコンテナへのパス
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# .htaccessファイルへのアクセスを拒否
location ~ /\.ht {
deny all;
}
}
PHPコンテナのDockerfile (php/Dockerfile)
# PHP 8 FPMの公式イメージをベースにする
FROM php:8-fpm
# システムパッケージの更新と必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
libpq-dev \
git \
curl \
unzip \
iputils-ping \
gcc \
make \
vim \
libjpeg-dev \
libfreetype6-dev \
libmcrypt-dev \
gnupg \
openssl \
nodejs \
npm \
&& docker-php-ext-install pdo pdo_pgsql \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Composerのインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Xdebugのインストール(xdebugの2重ロード防止のためdocker-php-ext-xdebug.iniを削除)
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# 作業ディレクトリを設定
WORKDIR /var/www/work
# Laravel プロジェクトの作成
RUN composer create-project --prefer-dist laravel/laravel .
# パーミッションの設定
RUN chown -R www-data:www-data /var/www/work
PHP設定ファイル (php/php.ini)
[PHP]
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
Xdebug設定ファイル (php/xdebug.ini)
zend_extension=xdebug.so
[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.log=/var/log/xdebug.log
VSCodeのデバッグ設定 (.vscode/launch.json)
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/work": "${workspaceFolder}/src"
}
}
]
}
docker-compose.yml
services:
# PHPコンテナ
app:
build:
context: ./php
dockerfile: Dockerfile
image: laravel_app:latest
container_name: laravel_app
restart: unless-stopped
working_dir: /var/www/work
volumes:
- ./src:/var/www/work # ホストのsrcディレクトリをコンテナの作業ディレクトリにマウント
- ./php/php.ini:/usr/local/etc/php/php.ini # カスタムPHP設定をマウント
- ./php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini # カスタムXdebug設定をマウント
ports:
- "9000:9000"
networks:
- laravel
# Nginxコンテナ
web:
image: nginx:latest
container_name: nginx
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./src:/var/www/work # ホストのsrcディレクトリをコンテナのドキュメントルートにマウント
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf # カスタムNginx設定をマウント
depends_on:
- app # PHPコンテナが先に起動するように設定
networks:
- laravel
# PostgreSQLコンテナ
db:
image: postgres:latest
container_name: postgres
restart: unless-stopped
environment:
POSTGRES_USER: laravel # データベースユーザー名
POSTGRES_PASSWORD: secret # データベースパスワード
POSTGRES_DB: laravel # デフォルトデータベース名
volumes:
- dbdata:/var/lib/postgresql/data # データ永続化用ボリューム
ports:
- "5432:5432" # PostgreSQLのポートを公開
networks:
- laravel
networks:
laravel:
driver: bridge
volumes:
dbdata:
driver: local
プロジェクトのセットアップ
src内にLaravelプロジェクトを作成
docker-compose run --rm app composer create-project --prefer-dist laravel/laravel .
.envのDB設定の記述を修正
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
コンテナの起動と動作確認
docker compose up -d
DB接続確認用のコードをresources/views/welcome.blade.phpに追加
<?php
try {
\DB::connection()->getPDO();
echo \DB::connection()->getDatabaseName(); # DBに接続できている場合、DB名が表示される
} catch (\Exception $e) {
echo 'None'; # 接続できていない場合は、Noneと表示される
}
phpinfo(); # PHPの情報を表示
?>