0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Docker]デプロイにどん詰まって本番構成を組み直した話

Posted at

◆ はじめに

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.ymlenv_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や監視を自動化していくフェーズに入る予定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?