MinEMemO

【Docker】【260607】#2 Laravel開発環境構築ファイル作成 & 起動

📝 更新日:2026-07-06 / 📄 作成日:2026-06-07
Hero Image
目次

はじめに

26年時点で手順がかなり変わってたので、不足分書き直しました。

私自身は本番のインフラ設定には詳しくありません。
とりあえず調べつつ動くものを記載しています。

過去記事はこちら
https://minememo.work/posts/docker3/

環境想定

  • Nginx 1.30.2 Stable
  • PHP 8.5.6 最新(26/06時点)
  • Composer:2.10.1 LTS
  • Laravel 13.14.0 最新(26/06時点)
  • MySQL 8.4.9 LTS
  • Git 最新

※バージョンは安全のため固定します
※26/06時点

フォルダ構造

以下のような構造でローカルに作業フォルダ、ファイルを作成します

Laravel13_sample
├─ docker
│  ├─ mysql
│  │  └─ my.cnf
│  ├─ nginx
│  │  └─ default.conf
│  └─ php
│     ├─ Dockerfile
│     └─ php.ini
├─ src
├─ docker-compose.yml

※srcにLaravelが入る

開発環境構築ファイル作成

ymlファイルを作成

Docker全体の設定管理ファイル

Laravel13_sample\docker-compose.yml


services:
  # ==========================================
  # PHP(Laravel)コンテナ
  # ==========================================
  app:

    # Dockerfileからイメージを作成する
    build:
      # Dockerが参照する起点フォルダ (docker-compose.yml がある場所)
      context: .
      dockerfile: docker/php/Dockerfile

    # コンテナ名
    container_name: laravel_app

    # コンテナ内の作業ディレクトリ
    working_dir: /var/www

    # フォルダ共有
    #
    # 左側  = ローカルPC側
    # 右側  = Docker側
    #
    # src配下の変更が即反映される
    volumes:
      - ./src:/var/www

    # dbコンテナ起動後にapp起動
    depends_on:
      - db



  # ==========================================
  # Webサーバー(Nginx)
  # ==========================================
  nginx:

    # 公式Nginxイメージ(最新安定版(Stable))を利用
    image: nginx:1.30.2

    container_name: laravel_nginx

    # ポート公開
    #
    # localhost:8080
    # ↓
    # nginx:80
    #
    ports:
      - "8080:80"

    volumes:

      # Laravelソース共有
      - ./src:/var/www

      # nginx設定読み込み
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf

    depends_on:
      - app



  # ==========================================
  # MySQL
  # ==========================================
  db:

    # 公式MySQLイメージ(最新8.4 LTS)を利用
    image: mysql:8.4.9

    container_name: laravel_mysql

    restart: always

    environment:

      # 作成するDB名
      MYSQL_DATABASE: laravel

      # 一般ユーザー
      MYSQL_USER: laravel

      # 一般ユーザーパスワード
      MYSQL_PASSWORD: password

      # rootパスワード
      MYSQL_ROOT_PASSWORD: root

    ports:

      # MySQLクライアント接続用
      #
      # DBeaver
      # TablePlus
      # MySQL Workbench
      #
      # ローカルで3306つかっていたので、PC側のポートを3307に変更
      # DBeaverで見るときは3307に接続する
      - "3307:3306"

    volumes:

      # DB永続化
      #
      # コンテナ削除しても
      # DBが消えない
      #
      - dbdata:/var/lib/mysql

# ==========================================
# 名前付きVolume
# ==========================================
#
# MySQLデータ保存領域
#
volumes:
  dbdata:

PHP Dockerファイル作成

docker\php\Dockerfile


# ==========================================
# PHP 8.5 FPM(PHPのバージョンイメージを指定)
# ==========================================
#
# PHP8.5 + PHP-FPM がインストール済み
# Nginxと組み合わせて使う
#
FROM php:8.5.6-fpm



# ==========================================
# Laravelでよく使うツール
# ==========================================
#
# git
#   Git操作で利用
#
# unzip
#   ZIP解凍コマンド
#
# zip
#   ZIP圧縮コマンド
#
# curl
#   URLアクセス確認などで利用
#
# libzip-dev
#   PHPのzip拡張をインストールするために必要
#
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    zip \
    curl \
    libzip-dev \
    libonig-dev



# ==========================================
# PHP拡張追加
# ==========================================
#
# pdo_mysql
#   Laravel→MySQL接続
#
# zip
#   PHPでZIPファイルを扱うために必要
#
# mbstring
#   Laravelでマルチバイト文字を扱うために必要
#
# bcmath
#   小数計算を正確に行うために必要
#   金額計算などで利用
#
RUN docker-php-ext-install \
    pdo_mysql \
    zip \
    mbstring \
    bcmath



# ==========================================
# Composer導入
# ==========================================
#
# Composer公式イメージから
# composerコマンドだけ取得
#
COPY --from=composer:2.10.1 /usr/bin/composer /usr/bin/composer



# ==========================================
# 作業フォルダ
# ==========================================
# ※ymlのコンテナ内の作業ディレクトリと同じにする
WORKDIR /var/www

nginx設定ファイル

docker\nginx\default.conf


server {

    # Webサーバー待受ポート
    # Webサーバーがクライアントからのリクエストを待ち受けるポート番号を指定する
    #
    # 以下は慣習でほぼ固定で使われるポート番号
    # 80 = HTTP
    # 443 = HTTPS
    listen 80;


    # デフォルトファイル(ファイル指定がない場合に表示されるファイル)
    index index.php index.html;


    # ドキュメントルート
    # Laravel公開ディレクトリ
    #
    # localhost:8080でアクセスした場合に表示されるディレクトリ
    # public/index.php
    #
    root /var/www/public;


    # =========================
    # URLアクセス
    # =========================
    location / {

        # Laravelルーティングへ渡す
        # 
        # Nginxの定番設定
        #
        # try_files = クライアントからのリクエストURLに対応するファイルが存在するか、左から順に確認する
        # $uri = クライアントからのリクエストURL(ファイルがあれば表示する)
        # $uri/ = クライアントからのリクエストURL (ディレクトリがあれば表示する)
        # /index.php  = ファイルもディレクトリも無かった場合、ルート(public/index.php)に処理を渡す
        # ?$query_string = GETパラメータをそのままLaravelへ渡す
        try_files $uri $uri/ /index.php?$query_string;

    }


    # =========================
    # PHP処理(FastCGIの設定)
    #
    # FastCGI:Webサーバ上で動くプログラム(PHP)を動きを速くしたりWebサーバの負荷を軽減することができる仕組み
    # =========================
    location ~ \.php$ {

        # PHPファイルへのアクセスはNginx自身では処理せず、PHP-FPMへ渡す(appコンテナの9000番ポート)
        # app = docker-compose.yml の appサービス名
        # 9000 = PHP-FPMが待ち受けているポート
        fastcgi_pass app:9000;

        # ディレクトリにアクセスされた時にデフォルトで使うPHPファイル
        fastcgi_index index.php;

        # PHP-FPMに「実行するPHPファイルのフルパス」をを伝えるためのパラメータ
        # fastcgi_param = FastCGI(PHP-FPM)へ設定値を渡す命令
        # SCRIPT_FILENAME = PHP-FPM側で決められているパラメータ名(実行するPHPファイルのフルパス)
        # $document_root = Nginxの root で指定した場所(/var/www/public)
        # $fastcgi_script_name = 実行対象のPHPファイル名
        #
        #例)SCRIPT_FILENAMEで /var/www/public/index.php をわたしてる
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # FastCGIでよく使う基本パラメータを読み込む
        #
        # 例:
        # REQUEST_METHOD
        # QUERY_STRING
        # CONTENT_TYPE
        # REQUEST_URI
        #
        # などをPHP-FPMへ渡す
        include fastcgi_params;
    }

}

おまけファイル

以下のファイルは今後設定したいときに使う。
今は記載なしです。

  • MySQL設定:docker\mysql\my.cnf
  • PHP設定:docker\php\php.ini

Laravelインストール

一旦コンテナビルド
docker compose build

src配下にLaravel生成
docker compose run --rm app composer create-project laravel/laravel:13.14.0 /var/www

※時間かかるので完了まで待つ

起動

作業フォルダに移動

cd "docker-compose.ymlがあるフォルダのパス"

Docker Desktopを起動

PCでアプリ起動

コンテナ起動

docker compose up -d

※下段の「初回起動時のみの作業」を行ったことがない場合は「docker compose up」の後に作業してください

表示確認

http://localhost:8080

コンテナ終了

docker compose down

初回起動時のみの作業

コンテナ起動後に以下を行う

Laravel の APP_KEY作成(アプリケーション全体の秘密鍵)

コンテナ内でコマンドプロンプト起動

docker compose exec app bash

※今回はPHPのDockerfileの作業フォルダ「/var/www」= appなのでそこで起動になる
※ymlの「working_dir: /var/www」も同じ設定になってる

APP_KEY作成

php artisan key:generate

※「Application key set successfully」が出れば成功

ここで今回はエラーになりました

「ls -la」でフォルダ構造確認し Laravel がなければ、PC の src フォルダを削除して空にし、 bashじゃなくPowerShellでLaravelをインストールし直してください。

インストールし直してコンテナ内にLaravelがあれば成功です。

※Git Bashのパス変換バグで「C:」とかになるときがあるらしいのでPowerShellで対応します。

docker compose exec app bash

LaravelにDB接続設定

.env

※開発用
※docker-compose.ymlの設定に合わせる

DB_CONNECTION=mysql

DB_HOST=db
DB_PORT=3306

DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password

マイグレーション

php artisan migrate

※コンテナ内のコマンドプロントで行う

補足

バージョン確認方法

環境構築後の確認方法

コンテナ起動

docker compose up -d

nginxバージョン確認

docker-compose exec nginx nginx -v

PHPバージョン確認

docker-compose exec app php -v

Composerバージョン確認

docker-compose exec app composer -v

インストール済の拡張機能の一覧

docker-compose exec app php -m

Laravelのバージョン確認

docker compose exec app php artisan -v

DB GUIツール

私はDBeaverを使っています。
今回の設定はポートが3307なので、ツールの接続設定で3307を指定すればつながります。

※3306がデフォなので、3306で問題ない方は書き換えて使っていただいても大丈夫です。
今回は私がローカルで3306を使っていたので、3307に変更しただけです。

※MySQL 8で「Public Key Retrieval is not allowed」でつながらないときは、「ドライバのプロパティ」で「allowPublicKeyRetrieval = true」に設定します。
(セキュリティ強化の影響で開発環境なら true でOK)
(本番環境だとSSL/TLSを使うので、そもそもallowPublicKeyRetrievalを使わないことが多い)

ホットリロード

ホットリロードはLaravel / PHP は入っていない。
入れ方もすこし複雑 + フロントしかからないのでF5で更新することも普通とのこと。

ASP.NET COREでは特に意識せずフロント、バックでホットリロード入っていたが、
言語の性質上このような仕様になってるとのこと

今回はReactなどまだ使わずにBlade想定なので、ホットリロードは保留とする。

  • C#はコンパイル言語

更新監視、再コンパイル・再起動でコード自体更新される

  • PHPはスクリプト言語

コードがそのまま実行されるだけでコンパイルじゃないので、バックはF5更新が必要。
フロントは設定して、Vue/Reactなど両方ともNode.js(Vite)でホットリロードを使うことになる

さいごに

Laravelの開発ができるようになりました。 本番のインフラをできるようになりたい・・。
profile_icon
taka
プログラマー
2017年11月から業務でPHPを触りだしたエンジニアです。 業務経験8年程度。 2022年から「要求整理→設計→実装→テスト→リリース」と開発のステップをきちんと経験したく、 転職を始めましたが、なかなか思う通りには・・・いっていません。 現職が自社案件枯渇、本社エリア以外のSES案件の繋がりがなしと急に発覚し、 26/05から急遽強制的に転職活動中。 現職をやめるつもりはなかったし、転職は本当に最後にしたいのでもしよければお声がけください。 参画したPJ、エンジニアとしての経験をまとめたGitHubリポジトリもあります。 https://github.com/tm-qc/ProjectExperience