Laravelの開発環境をDockerで構築し、さくらインターネットにデプロイする方法

大まかなフロー

  1. ローカルでDockerで作成した環境にLaravelをインストール
  2. srcフォルダをGithubにリポジトリを作成

ローカル環境

laravel-project/
│
├── docker/
│   ├── php/
│   │   └── Dockerfile
│   └── nginx/
│       └── default.conf
│
├── docker-compose.yml
└── src/     # まだ空

phpの設定

docker\php\Dockerfile

FROM php:8.2-fpm

# 必要なパッケージを全て最初からインストール
RUN apt-get update && apt-get install -y \
    git \
    zip \
    unzip \
    nodejs \
    npm \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    sqlite3

# PHPの拡張機能をインストール
RUN docker-php-ext-install pdo_mysql

# Composerインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

nginxの設定

docker\nginx\default.conf

server {
    listen 80;
    root /var/www/html/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Dockerの設定

docker-compose.yml

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: docker/php/Dockerfile
    volumes:
      - ./src:/var/www/html

  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
# Dockerコンテナを起動
docker-compose up -d

Laravelのインストール

# 1. まず、appコンテナに入る場合
docker-compose exec app bash

# 2. コンテナ内で実行されるComposerコマンド
composer create-project laravel/laravel .

composer create-project

  • Composerの機能で新しいプロジェクトを作成する命令
  • PHP のパッケージマネージャーである Composer の機能
src/
├── app/          # アプリケーションのコアコード
├── bootstrap/    # フレームワークの起動ファイル
├── config/       # 設定ファイル
├── database/     # データベース関連ファイル
├── public/       # Webサーバーのドキュメントルート
├── resources/    # ビュー、CSS、JSなど
├── routes/       # ルーティング定義
├── storage/      # ログ、キャッシュなど
├── tests/        # テストファイル
├── vendor/       # Composer依存パッケージ
├── .env          # 環境設定ファイル
├── artisan       # コマンドラインツール
└── composer.json # パッケージ依存関係の定義

.envファイル編集

src/.env

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:q2QBqULWSbDokQMj1CEWuMZlhr3Y8SXtF5AiAUQUAEk=
APP_DEBUG=true
APP_URL=http://localhost:8080  # ポート番号を追加

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=sqlite
# DB_DATABASE=/var/www/html/database/database.sqlite  # コメントアウトして自動設定を使用

SESSION_DRIVER=file  # データベースではなくfileを使用
SESSION_LIFETIME=120

CACHE_DRIVER=file    # データベースではなくfileを使用
QUEUE_CONNECTION=sync  # データベースではなくsyncを使用

権限設定

# storage(ログ、キャッシュ用)
docker-compose exec app chown -R www-data:www-data storage
docker-compose exec app chmod -R 775 storage

# bootstrap/cache(フレームワークキャッシュ用)
docker-compose exec app chown -R www-data:www-data bootstrap/cache
docker-compose exec app chmod -R 775 bootstrap/cache

# database(SQLite用)
docker-compose exec app chown -R www-data:www-data database
docker-compose exec app chmod -R 775 database

SQLiteデータベース設定

docker-compose exec app touch database/database.sqlite
docker-compose exec app chmod 664 database/database.sqlite
docker-compose exec app chown www-data:www-data database/database.sqlite

キャッシュクリア

  • .envファイルの変更を反映するため
  • 設定の変更(DB接続情報など)を確実に適用するため
docker-compose exec app php artisan config:clear
docker-compose exec app php artisan cache:clear

マイグレーション実行

データベースのテーブルを作成

# データベースのテーブルを作成
docker-compose exec app php artisan migrate

npmのインストールと初期設定

# コンテナ内でnpm installを実行
docker-compose exec app npm install

# 開発用のビルドを実行
docker-compose exec app npm run dev

デプロイ方法

方法 1)本番環境でComposerインストールする(一般的)

vendorディレクトリの中身のライブラリがサイズが大きいので、package.json?だけ共有して、それぞれの環境でインストールするのが一般的(重たいファイルのやり取りはしたくない)

  • ✅ リポジトリが軽量
  • ✅ 各環境で最適化されたインストール
  • ❌ インストール時間が必要
  • ❌ インストール失敗のリスク
  • ❌ サーバーにComposerが必要

方法 2)vendor/ディレクトリを含めてバージョン管理して本番環境にアップロードする
→ 今回はこちらの手順を実施

  • ✅ デプロイが確実
  • ✅ Composerインストール不要
  • ❌ リポジトリが大きくなる

Gitリポジトリ設定

src/                  # Laravelプロジェクト
├── app/
├── bootstrap/
├── config/
├── database/
├── public/
├── resources/
├── routes/
├── storage/
├── tests/
├── vendor/          # ★これを含める(Composerインストール不要に)
├── composer.json
├── composer.lock
└── .gitignore           # Docker関連ファイルは除外

本番環境での設定

.envファイルの作成と設定

.env.exampleをコピー

# .env ファイルを作成
cp .env.example .env

.env

APP_NAME=Laravel
APP_ENV=production
APP_DEBUG=false
APP_URL=https://siennahare23.sakura.ne.jp/laravel-d01

DB_CONNECTION=sqlite
# その他のDB設定はコメントアウト

SESSION_DRIVER=file
CACHE_DRIVER=file

権限の設定

# 権限を設定
chmod -R 775 storage bootstrap/cache

ストレージリンクの作成

アップロードされたファイル(画像など)を公開アクセス可能にする storage/app/publicpublic/storage をリンクさせる

# ストレージリンクの作成
php artisan storage:link
laravel-dir/
├── public/          # Webからアクセス可能なディレクトリ
│   └── storage -> ../storage/app/public  # シンボリックリンク
│
└── storage/
    └── app/
        └── public/  # 実際のファイル保存場所

ユーザーが画像をアップロードする→画像は storage/app/public に保存される →public/storage からアクセス可能になる

キャッシュのクリアと再生成

php artisan config:clear  # 設定ファイルのキャッシュを削除
php artisan cache:clear   # アプリケーションのキャッシュを削除
php artisan view:clear    # コンパイル済みビューファイルを削除

php artisan config:cache  # 設定ファイルを1つのファイルにまとめる
php artisan route:cache   # ルート情報をキャッシュ
php artisan view:cache    # ビューファイルをプリコンパイル

.htaccessの設定

laravel-dir/.htaccess

# PHPファイルの実行設定(.phpの拡張子のファイルをPHPスクリプトとして実行)
AddHandler application/x-httpd-php .php

# サーバー基本設定
# +SymLinksIfOwnerMatch: シンボリックリンクを許可(所有者が同じ場合のみ)
# -Indexes: ディレクトリ一覧の表示を無効化(セキュリティ対策)
Options +SymLinksIfOwnerMatch -Indexes

# デフォルトで表示するファイルをindex.phpに設定
DirectoryIndex index.php

# mod_rewriteモジュールが利用可能な場合の設定
<IfModule mod_rewrite.c>
   # URLの書き換え機能を有効化
   RewriteEngine On
   
   # ベースとなるURLパスを設定(/laravel-d01/以下のURLに対してルールを適用)
   RewriteBase /laravel-d01/
   
   # ディレクトリ一覧の表示を明示的に無効化(追加のセキュリティ対策)
   Options -Indexes
   
   # publicディレクトリへのアクセスは書き換えずにそのまま通す
   # 例:/laravel-d01/public/css/style.css → そのままアクセス可能
   RewriteRule ^public/ - [L]
   
   # ルートへのアクセス(/laravel-d01/)をpublic/index.phpへ転送
   # [L]フラグで以降のルールは適用しない
   RewriteRule ^$ public/index.php [L]
   
   # 上記以外のすべてのリクエストをpublicディレクトリ配下に転送
   # 例:/laravel-d01/about → /laravel-d01/public/about
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

laravel-dir/public/.htaccess

# PHPの設定
AddHandler application/x-httpd-php .php

# 基本設定
Options +SymLinksIfOwnerMatch
DirectoryIndex index.php

# mod_rewriteの設定
<IfModule mod_rewrite.c>
    RewriteEngine On
    
    # 実ファイルが存在する場合はそのまま表示
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # それ以外はindex.phpにリダイレクト
    RewriteRule ^ index.php [L]
</IfModule>

本番環境にNPMをインストールしない

本番環境では、できるだけサーバー負荷を軽減し、セキュリティリスクも減らすために不要なソフトウェアをインストールしない方が良いです。

NPMやNode.jsは通常、フロントエンドのビルドにしか使わないため、本番環境には必須ではありません。

そのため、開発環境で必要なビルドを完了させ、生成されたファイルのみを本番環境にアップロードすることで、シンプルかつ安全な運用が可能になります。

参考サイト

必ずしも本番環境のサーバーにNPMのインストールは必要ないと思います。
開発環境でNode.jsのビルドを行い、作成されたJavaScriptファイルをアップロードするのも手です。