◆ はじめに
Laravel × Docker構成でSNSサービス「Apprentory」を開発しているんですが、
最初のうちは Dockerまわりは全部相方に一任してました。理由は単純、「よくわからんし、壊しそうだから」。
でも本番デプロイで詰まったある日、
「自分でやるしかない」という状況に追い込まれ、ついに触る決意をしました。
◆ 起きていた問題
- コンテナを再起動するとデータが消える
- 本番環境とローカルで構成が微妙に違う
- ポートやボリュームの設定が不明瞭
-
.env
の扱いや Nginx / Apache の関係も曖昧
特に困ったのは「動いていたはずのLaravelが突然エラー」になること。
調べると、MySQLコンテナが新規起動されて中身が空っぽ → LaravelがDB接続エラー → 画面真っ白。
◆ 自分で構成しなおしたこと
以下の観点でDockerまわりを整理し直しました:
1. MySQLの永続化(ボリューム設定)
volumes:
- apprentory-db-data:/var/lib/mysql
2. 環境ごとの .env
管理を統一
-
.env
はホスト側に保持し、Laravelに確実に読み込ませるようにマウント -
docker-compose.yml
にenv_file
を明記
3. Nginx/Apacheを本番で使わず、Laravelコンテナで80番ポートを直接公開
4. LaravelのストレージシンボリックリンクをDocker経由でも通す
php artisan storage:link
5. ログやDBの永続化を意識し、再起動に耐える構成にした
6. Laravel本番用の Dockerfile を自前で設計
もともとベース構成すらわからず相方任せにしていたが、本番運用を見据えて以下の点を盛り込んだDockerfileを自分で用意。
- Laravelで必要なPHP拡張(pdo_mysql, zip, mbstringなど)を明示的にインストール
- 日本語ロケール設定やタイムゾーン調整(
Asia/Tokyo
) - ApacheのDocumentRootを
/public
に書き換えてLaravelを正しく表示 - composer, nodejs, npm, vim, ping など CLIも充実させて、コンテナの中でも安心してデバッグできる環境を構築
FROM php:8.2-apache
# 標準ライブラリ系
RUN apt-get update && apt-get install -y \
git \
zip unzip \
libzip-dev \
libonig-dev \
libpq-dev \
libjpeg-dev \
libpng-dev \
libfreetype6-dev \
libxml2-dev \
libcurl4-openssl-dev \
curl \
nano \
nodejs npm \
&& docker-php-ext-install pdo pdo_mysql zip mbstring exif pcntl
# 日本語ロケール&タイムゾーン設定&便利CLI
RUN apt-get update && apt-get install -y \
locales \
tzdata \
vim \
htop \
net-tools \
iputils-ping \
lsof && \
sed -i '/ja_JP.UTF-8/s/^# //g' /etc/locale.gen && \
locale-gen ja_JP.UTF-8 && \
ln -snf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && echo 'Asia/Tokyo' > /etc/timezone
ENV LANG=ja_JP.UTF-8
ENV LANGUAGE=ja_JP:ja
ENV LC_ALL=ja_JP.UTF-8
ENV TZ=Asia/Tokyo
# Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Apacheドキュメントルート設定
WORKDIR /var/www/html
RUN chown -R www-data:www-data /var/www && a2enmod rewrite
RUN sed -i 's|DocumentRoot /var/www/html|DocumentRoot /var/www/html/public|' /etc/apache2/sites-available/000-default.conf
このDockerfileを使うことで、コンテナ起動時点でLaravelアプリが即起動できるようになり、
「一度動けばOKだった構成」から「再現性とメンテ性の高い構成」に一歩近づけた。
◆ 学んだこと
-
「怖い」より「わからない」の方が敵だった
→ 分解して一つずつ触れば理解できた -
最小構成から始めるのが安心
→ まず Laravel + MySQL だけ、必要に応じて他追加 - 開発メンバーが複数いる場合でも、誰でも再構築できる構成が正義
◆ 最後に
今ではDockerのエラーも「コンテナ叩いてログ見る」くらいは抵抗なくできるようになりました。
最初に自分で触る決断ができたのが、今思えば一番のブレイクスルー。
次はこの構成をベースに CI/CDや監視を自動化していくフェーズに入る予定です。