はじめに
Docker 上で Laravel + Apache 環境を構築して、ルーティング確認まで行った際の備忘録です。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
初学者として PHP のキャッチアップをしている中で、詰まりやすいポイントを整理しておきます。
書こうと思ったきっかけ
個人的に PHP のキャッチアップをしたくて Laravel を触っていたところ、http://localhost:8080/hello
が何度やっても表示されずハマりました。そこで一つずつ検証しながら解決できたので、今後の自分や誰かの参考になればと思いまとめています。
内容
表示されなかった主な原因(※あくまで自分の環境調べ)
- Apache のドキュメントルートが Laravel の
public/
ではなかった - Laravel アプリは
public/
をドキュメントルートにしないと、index.php
に到達できず Apache が "Not Found" を返す - 初期状態:
/var/www/html
がドキュメントルートのまま →/public/index.php
にアクセスできなかった
解決策
Dockerfile に以下を追加して、Apache のルートを public/
に変更しました:
RUN sed -i 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf
WORKDIR /var/www/html/public
その他重要な設定
設定項目 | 意味 |
---|---|
.htaccess 配置 |
ルーティングを Apache に正しく伝える |
AllowOverride All |
.htaccess を Apache に有効化させる |
mod_rewrite |
Laravel の内部ルーティングを機能させる |
変更した主なファイル
Dockerfile
# PHP 8.2 + Apache の公式イメージをベースにする
FROM php:8.2-apache
# Laravelで必要なパッケージをインストール(zip, git, curl など)
RUN apt-get update && apt-get install -y \
zip unzip git curl libzip-dev libonig-dev \
&& docker-php-ext-install pdo_mysql zip
# Composer(PHPのパッケージ管理ツール)をインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# LaravelのpublicフォルダをApacheのドキュメントルートに設定
RUN sed -i 's!/var/www/html!/var/www/html/public!g' /etc/apache2/sites-available/000-default.conf
# .htaccess を使うために mod_rewrite を有効化
RUN a2enmod rewrite
# 作業ディレクトリを Laravel の public に設定
WORKDIR /var/www/html/public
# Laravelアプリのソースコードをコピー
COPY src/ /var/www/html/
src/routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HelloController;
Route::get('/', function () {
return view('welcome');
});
Route::get('/hello', [HelloController::class, 'index']);
src/app/Http/Controllers/HelloController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
public function index()
{
return 'こんにちは!これは Hello ページです。';
}
}
実際の画面
まとめ
Laravel アプリを Docker 上の Apache で動かす際は、私の環境で修正した部分は以下になります。
- Apache のドキュメントルートを
public/
にすること -
.htaccess
を有効にするにはAllowOverride All
-
mod_rewrite
を有効にして Laravel にルーティングを渡す
この3つが揃って初めて、http://localhost:8080/hello
が正しく表示されました。
同じようにハマっている方の参考になれば幸いです...!