0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker Composeを使用してLaravel11のデバック環境を構築してみた

Posted at

はじめに

卒業研究で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の情報を表示
?>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?