はじめに
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時点
nginx
https://nginx.org/en/download.html
PHPサポート期間
https://www.php.net/supported-versions.php
PHPリリース
https://www.php.net/releases/index.php
Composer
https://getcomposer.org/download/
Laravelリリースノート
https://laravel.com/docs/13.x/releases
Laravel細かいバージョンリリース一覧
https://laravelversions.com/ja/13
フォルダ構造
以下のような構造でローカルに作業フォルダ、ファイルを作成します
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」の後に作業してください
表示確認
コンテナ終了
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)でホットリロードを使うことになる
