Laravel12の開発環境をDockerで構築する の変更点
#author("2025-03-13T16:46:58+09:00","default:pitablog","pitablog")
#author("2025-03-13T16:47:23+09:00","default:pitablog","pitablog")
* Laravel12の開発環境をDockerで構築する [#aaf8f099]
#splitbody{{
LEFT:
&tag(情報技術,PHP,Web,プログラミング,Docker,Laravel);
#split
RIGHT:&size(13){投稿日: 2025-03-13 (木)};
}}
#ref(https://i.imgur.com/AjObGy2.png)
&br;
#bcontents
** はじめに [#l70eb326]
いきなりですが、ファイルやらディレクトリを記載しておきます。
*** 作成する環境 [#bda520b3]
- Nginx (Alpine Linux): latest
- MySQL: latest
- PHP: v8.3 (FPM)
- phpMyAdmin: latest
- Composer: latest
- Nodejs: v20.9.0
- Laravel
- VITE
*** 現時点での私環境 [#sbb69443]
- OS: Windows 11 23H2
- Docker: 27.5.1, build 9f9e405
- PHP: 8.3.17
- MySQL: 9.2.0
- Composer: 2.8.6
- Laravel: v12.1.1
- VITE: v6.2.1
- npm: 10.1.0
- Node.js: v20.9.0
- phpMyAdmin: 5.2.2
** ファイル構造 [#hc98fc09]
- compose.yaml
- .env (任意)
- src/
- app/
- db/
- docker/
- php/
- Dockerfile
- php.ini
- nginx/
- Dockerfile
- default.conf
- .dockerignore (任意)
** compose.yaml [#h9fb4d08]
すでにポートが埋まっていて各ポートを変更したい方はportsのところを変更してください。
ホスト側:コンテナ側 です。左側のホスト側のポートだけ変更するといいでしょう。
ちなみにdocker-compose.ymlじゃないの?って思う方いらっしゃるかもしれませんが、compose.yamlが現在は推奨されているそうです。
- compose.yaml
#gcode(yml){{
services:
web:
container_name: web
build: ./docker/nginx
ports:
- 80:80
volumes:
- ./src/app:/var/www/html
app:
container_name: app
mem_limit: 8g
build: ./docker/php
volumes:
- ./src/app:/var/www/html
- storage-volumes:/var/www/html/storage/framework
- vendor-volumes:/var/www/html/vendor
ports:
- 5173:5173
environment:
- DB_CONNECTION=${DB_CONNECTION:-mysql}
- DB_HOST=${DB_HOST:-db}
- DB_PORT=${DB_PORT:-3306}
- DB_DATABASE=${DB_NAME:-laravel}
- DB_USERNAME=${DB_USER:-user}
- DB_PASSWORD=${DB_PASS:-password}
depends_on:
- db
db:
container_name: db
image: mysql
ports:
- 3306:3306
environment:
- MYSQL_DATABASE=${DB_NAME:-laravel}
- MYSQL_USER=${DB_USER:-user}
- MYSQL_PASSWORD=${DB_PASS:-password}
- MYSQL_ROOT_PASSWORD=${DB_PASS:-password}
volumes:
- ./src/db:/var/lib/mysql
pma:
container_name: pma
image: phpmyadmin
restart: always
ports:
- 81:80
environment:
- PMA_HOST=${DB_HOST:-db}
- PMA_USER=${DB_USER:-user}
- PMA_PASSWORD=${DB_PASS:-password}
depends_on:
- db
volumes:
storage-volumes:
vendor-volumes:
}}
phpMyAdminが不要ならばpmaの部分は削除するといいでしょう。
*** 各ポート番号の割り当て先 [#la89e784]
上記のcompose.yamlのポート割当先は以下の通りです
- 80 にWebサーバー (Nginx)
- 5173 にVite用の開発サーバー (dockerイメージはphpだが、フロントエンドの開発サーバーとして使う)
- 3306 にデータベース (MySQL)
- 81 にDBツール (phpMyAdmin)
となっている。
** docker/nginx/Dockerfile, default.conf [#k7a8f431]
compose.yamlの build: ./docker/nginx で指定したディレクトリです。
Alpine Linux上のNginxイメージを使います。
- docker/nginx/Dockerfile
#gcode{{
FROM nginx:stable-alpine
COPY default.conf /etc/nginx/conf.d/default.conf
}}
Nginx用の仮想ホスト設定ファイルです。
(開発環境用なので本番環境ではもっとセキュリティを考慮して変えましょう)
- docker/nginx/default.conf
#gcode(){{
server {
listen 80;
listen [::]:80;
root /var/www/html/public;
index index.php;
charset utf-8;
server_tokens on; # Ngnixのバージョン表示 (デバッグ用)
# add_header X-Frame-Options "SAMEORIGIN"; # クリックジャッキング対策
add_header X-Content-Type-Options "nosniff"; # MIMEタイプスニッフィング対策
# キャッシュの無効化 (デバッグ用)
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
add_header Pragma "no-cache";
add_header Expires 0;
# CORS対応 (デバッグ用)
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, DELETE, PUT, PATCH";
add_header Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
# アクセス制限
location ~ /\.(?!well-known).* {
deny all;
}
}
}}
** docker/php/Dockerfile, php.ini [#dd16c21b]
PHP 8.3 FPM版を使います
FPMはNginx上で動かすことができ、そして普通のCGI版よりも速度が早いFast CGIってのが使われているそうです。
- docker/php/Dockerfile
#gcode{{
FROM php:8.3-fpm
EXPOSE 5173
COPY php.ini /usr/local/etc/php/php.ini
# git, zip, unzip, vim, wget, xz-utils, libzip-dev, curl, PHP拡張(pdo_mysql, mysqli, zip) のインストール
RUN apt-get update && apt-get install -y \
git zip unzip vim wget xz-utils libzip-dev curl \
&& docker-php-ext-install pdo_mysql mysqli zip \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Node.js (LTS) のインストール
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
&& apt-get install -y nodejs
# Composer のインストール
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
# nvm のインストール
ENV NODE_VERSION=20.9.0
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash \
&& bash -c ". /root/.nvm/nvm.sh \
&& nvm install ${NODE_VERSION} \
&& nvm use ${NODE_VERSION} && nvm alias default ${NODE_VERSION}"
ENV NVM_DIR=/root/.nvm
ENV PATH="/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"
# バージョン確認
RUN php --version && node --version && npm --version && composer --version
# コンテナ内の作業ディレクトリを指定 (デフォルトのカレントディレクトリ)
WORKDIR /var/www/html
}}
PHPの設定ファイルです
- docker/php/php.ini
#gcode(ini){{
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
zend.multibyte = On
zend.script_encoding = UTF-8
mbstring.language = "Japanese"
}}
** .env [#d4b3a438]
環境変数です。
compose.yaml にて${DB_NAME:-laravel}と指定されている箇所は.envで定義されたDB_NAMEを使い、未定義であればDB_NAME=laravelをデフォルトとしています。
- .env
#gcode(env){{
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_NAME=laravel
DB_USER=user
DB_PASS=password
}}
本番環境でなければこのままで問題ないです
ちなみに変更するのであれば間違ってGitでコミットしないように.gitignoreも設定しておき、なお.env.exampleも用意しておくといいでしょう
** .dockerignore [#ob581569]
ビルドに必要ないファイルを指定できます。いわゆる.gitignoreみたいなやつです。(構文は違うので気をつけてください)
- .dockerignore
#gcode(txt){{
.env
.git
.gitignore
}}
** src/app, src/db [#n235720b]
- src/
- app/
- db/
上記のようなフォルダ構造になるようにディレクトリを作成してください。
app が作業フォルダとなります。
ほとんどはvar/www/htmlそのままだと思います。一部だけ最適化のためにボリュームに入ってますが。
dbはMySQLのデータが入るフォルダです。
シンボリックリンクが対応していないドライブ上でMySQLをバインドマウントするとエラーが発生して起動できなくなる可能性があります。
[[DockerのMySQLが起動しない問題、exFATのせいだった]] でこの件について記載しましたが、NTFSなどのシンボリックリンクをサポートしているファイルシステムを用いたドライブ上を使うことが無難です。(もし、exFATでも使いたいのであればバインドマウントをやめるかmysql用のDockerfileを作ってmy.confにてシンボリックリンクを無効にすると良いでしょう)
** セットアップ [#hb48be49]
ファイルの配置が終わったら以下のコマンドを実行しましょう。ビルドと起動をしてくれます。
docker compose up -d
ビルドは初回のみなのでDockerfileなどに変更を加えた場合、二度目から再ビルドするためには「docker compose up -d --build」のように--buildを追加する必要があります。
起動できたら
docker compose exec app bash
でシェルに入りましょう。
*** Laravelのインストール [#ab81df2d]
docker/php/Dockerfile でデフォルトのカレントディレクトリを「/var/www/html/」としているので起動後も「/var/www/html/」となっていると思います。
コンテナ内のシェルで以下を実行します。
export COMPOSER_PROCESS_TIMEOUT=1200
composer create-project laravel/laravel .
chmod -R 777 /var/www/html/storage /var/www/html/bootstrap/cache
COMPOSER_PROCESS_TIMEOUTはPHPのComposerで1200秒まで1つのプロセスにかけてもよい、逆に言えばそれ以上時間がかかると強制停止されます。
デフォルトでは300秒となっており、それでは短すぎてスペックの低いPCや回線の悪い場所ではパッケージのインストールに失敗する可能性があるため設定しました。
*** 閉じるには [#fe1df945]
docker compose down
です。
** おまけ [#i3f67cc7]
ついでのメモみたいな感じです。
*** Laravel Breeze [#h03cef9b]
LaravelのBreezeパッケージをインストールし、それを使ってReactも導入します。
2番のコマンドによってReactの他にInertia.jsやLaravel Sailなどもインストールされます。
composer require laravel/breeze --dev
php artisan breeze:install react
*** Chakra UI [#u7a54879]
npm install @chakra-ui/react @emotion/react @emotion/styled framer-motion @chakra-ui/icons`
*** .gitignore [#j8d71329]
.env
src/*
** エラー [#a97a5153]
*** Error response from daemon: error while creating mount source path 'xxx': mkdir xxx: file exists [#jae6f17a]
これはsrc/app、src/dbのフォルダを作り忘れていると思います。
*** [Server] Could not set file permission for private_key.pem [#x8397e1d]
dbのマウント先フォルダの権限の設定がミスっていると思われます。
もしくはファイルシステムがシンボリックリンクをサポートしていないかもしれません。->[[DockerのMySQLが起動しない問題、exFATのせいだった]]
** コメント [#e1eae827]
#pctrlcmt
&size(10){キーワード: 情報技術, Docker, コンテナ, プログラミング, ウェブ, Laravel12, PHP8, 仮想環境, web, フレームワーク, Framework, データベース, JavaScript};
&size(10){キーワード: 情報技術, Docker, コンテナ, プログラミング, ウェブ, Laravel12, PHP8, 仮想環境, web, フレームワーク, Framework, データベース, JavaScript, 最新, 方法, やり方};