【コンテナ技術】第1回:Docker Compose設計の基本 ― dev/prodを分けて破綻を防ぐ|現場で困らないDocker ― 設計・運用の実務ガイド

   夜空を飛ぶコンテナを背負ったdockerクジラ

はじめに

前回の連載「現場で使うDocker実践入門(全5回)」では、Dockerの基本からDockerfile、Docker Composeの基礎、そして運用の最初の一歩までを整理しました。
これで「とりあえず動かせる」状態にはなったはずです。

ただ、業務でDockerを使う場合はここからが本番です。
Dockerは便利な反面、最初の設計が雑なまま進めると、運用フェーズで一気に苦しくなります。

そこで今回から、続編として「現場で困らないDocker ― 設計・運用の実務ガイド」を全5回でお届けします。
このシリーズでは、Docker Composeを中心に、開発環境・検証環境・本番環境を破綻させないための考え方と、現場で役立つ運用の型を整理していきます。

第1回となる今回は、最初に押さえるべきテーマとして「Docker Compose設計の基本(dev/prodの分け方)」を扱います。

Docker Composeは「開発用ツール」なのか?

Docker Composeは、もともと開発環境で使われることが多い仕組みです。
ただし最近では、次のような用途でもよく使われます。

  • 小規模システムの本番運用
  • 検証環境(ステージング)
  • 社内向けシステムの運用
  • オンプレミス環境での安定稼働

つまりComposeは「開発専用」ではありません。

ただし、本番で使うなら、最低限の整理が必要です。
その整理をせずに進めると、運用フェーズで確実に困ります。

よくある失敗:docker-compose.ymlが1つだけで肥大化する

Dockerを始めたばかりの段階では、たいてい以下のようになります。

  • docker-compose.yml が1つ
  • その中に全部書く
  • 動いたのでそのまま運用へ

しかしこの形は、後からほぼ確実に破綻します。

なぜなら、開発環境と本番環境では「求めるもの」が違うからです。

例えば、開発環境では

  • ソースコードをホストからマウントしたい
  • デバッグログを多めに出したい
  • DBを簡単に初期化したい

一方、本番環境では

  • ソースコードをマウントしない(事故の原因)
  • ログは必要十分に抑える
  • DBは絶対に消えない設計にする

つまり、同じComposeファイルに両方を詰め込むと、どちらにも中途半端になります。

結論:Composeは「基本+差分」で設計する

実務でおすすめの型は、以下です。

docker-compose.yml は「共通の基本」だけを書く
環境差分は別ファイルに分ける

代表的には次のように分けます。

  • docker-compose.yml(共通)
  • docker-compose.dev.yml(開発用の差分)
  • docker-compose.prod.yml(本番用の差分)

こうすると、用途に応じて次のように起動できます。

起動コマンドの型(これだけ覚えればOK)

開発環境の起動

docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d

 

本番環境の起動

docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Composeは、後ろに指定したファイルが「上書き」になります。
この仕組みを使うと、共通部分と差分をきれいに分けられます。

共通ファイル(docker-compose.yml)に書くべき内容

共通ファイルには、次のような「どの環境でも変わらないもの」だけを書きます。

  • サービス構成(web/dbなど)
  • コンテナ名(必要なら)
  • イメージやビルド定義
  • ネットワーク
  • 永続化すべきボリューム

ここでのポイントは、「開発専用の設定は書かない」です。

開発用ファイル(docker-compose.dev.yml)に書く内容

開発用ファイルに書くべき内容は、主に以下です。

  • ソースコードのマウント(volumes)
  • 開発用ポート公開
  • デバッグ設定
  • 開発用の追加ツール(phpMyAdminなど)

例えば、開発では「編集したソースが即反映される」ことが重要です。
そのため、ホスト側のフォルダをコンテナにマウントします。

本番用ファイル(docker-compose.prod.yml)に書く内容

本番用ファイルに書くべき内容は、次のようなものです。

  • 不要なポート公開をしない
  • マウントを減らす(基本はしない)
  • restartポリシーを設定する
  • ログの保存方法を整理する

本番で重要なのは、便利さよりも「事故を防ぐこと」です。

たとえば開発ではDBを外部公開しても問題になりにくいですが、本番で3306を公開するとリスクになります。

環境変数(.env)の整理は必須

Compose運用でよくある混乱が、環境変数の管理です。

  • docker-compose.yml の中に直書き
  • サービスごとにバラバラ
  • どこで設定したかわからない

こうなると、運用担当者が交代したときに引き継ぎが破綻します。

そこで、Composeでは.envファイルを使うのが基本です。

例えば以下のようにします。

  • .env(共通)
  • .env.dev(開発)
  • .env.prod(本番)

そして本番用はGitに入れない(事故防止)という運用が一般的です。

「運用で困らない」ための最低限チェック

最後に、Compose設計の段階で押さえておくべき最低限のポイントをまとめます。

DBのボリュームは必ず分離する

DBはコンテナを消したら終わりです。
必ずボリュームを切り、データが残る設計にします。

本番で不要なポート公開をしない

開発では便利でも、本番ではリスクになります。

restart設定を入れる

本番では、サーバ再起動後に自動で復帰できる形が重要です。

起動手順を固定する

「人によって起動方法が違う」状態は、トラブルの元です。
コマンドは決め打ちで統一します。

次回予告

次回(実務編 第2回)は、より具体的に踏み込みます。

PHP+Nginx+MariaDB構成を、業務で使える最小の正解として整理します。

特に、実務では以下が重要です。

  • PHPの拡張モジュール
  • Nginx設定の置き方
  • DB接続設定の持ち方
  • ボリュームの整理

「とりあえず動く」ではなく、「引き継げる形」を目指します。