第2回:Dockerの基本 ― イメージ・コンテナ・ボリュームを運用目線で理解する |現場で使えるDocker/コンテナ設計 ― 運用で詰まらないために

はじめに

第1回では「なぜ今コンテナなのか」を、VMとの違いを軸に整理しました。
第2回では、実務で必ず登場するDockerの基本要素を、運用・保守の観点で解説します。

Dockerを触り始めた直後に、多くの人がつまずくのは次の点です。

  • 「イメージ」と「コンテナ」の違いが直感的に分からない
  • コンテナを消したらデータも消えた
  • ログや設定ファイルがどこにあるか分からない
  • ネットワークが急に繋がらなくなった

これらはすべて、Dockerの構造を知らないまま「動いたからOK」で進めてしまうことで起きます。
今回は、Dockerを運用で使うための土台を固めます。

Dockerを構成する4つの要素

Dockerは一見シンプルですが、実務では次の4要素を理解しておく必要があります。

  • イメージ(image)
  • コンテナ(container)
  • ボリューム(volume)
  • ネットワーク(network)

この4つを、運用目線で正しく整理できると、コンテナ環境のトラブル対応が一気に楽になります。

イメージとは何か:環境の「設計図」

イメージとは、アプリケーション実行に必要な環境をまとめた「雛形」です。
OSそのものではなく、正確には「アプリが動くためのファイル群と設定が入ったもの」と考えるとよいです。

イメージは原則「変更しない」

Docker運用で重要な思想は、イメージは基本的に不変(immutable)であるという点です。
たとえば、次のような運用はDockerでは推奨されません。

  • コンテナにログインしてapt installする
  • 本番コンテナで設定ファイルを直接編集する
  • 動いているコンテナに後からPHP拡張を入れる

これをやると、コンテナごとに状態が変わり、再現性が崩れます。
Dockerを使う意味が薄れてしまいます。

Dockerfileは「構築手順書」ではなく「構築の実体」

従来の手順書は「読む→人が実行」でした。 Dockerfileは「書く→Dockerが実行」です。

つまりDockerfileは、運用引継ぎにおける最重要資産になります。

何をインストールしたか

どの設定が必要か

どの順序で構築したか

がコードとして残るため、属人性を大きく減らせます。

コンテナとは何か:イメージから作る「実行体」

コンテナは、イメージから作られる実行環境です。 イメージが設計図なら、コンテナは実際に動いているインスタンスです。

コンテナは「消して作り直す」のが基本

Docker運用では、コンテナは使い捨てに近い考え方をします。 例えば次のような流れが一般的です。

  • Dockerfileを更新して新しいイメージを作る
  • 古いコンテナを停止・削除する
  • 新しいイメージから新しいコンテナを起動する

この運用が成立することで、環境が常にクリーンになり、
「いつの間にかサーバーが汚れて動かない」という事故が減ります。

コンテナ内部は「永続領域ではない」

ここが最大の落とし穴です。 コンテナの中に保存したデータは、コンテナ削除で消える可能性があります。

特に業務システムでは、次のようなものをコンテナ内に置くと事故になります。

  • DBデータ
  • アップロードファイル
  • バッチ処理の中間成果物
  • アプリの永続ログ

これを解決するのが、次に説明するボリュームです。

ボリュームとは何か:データを守る「金庫」

ボリュームは、コンテナとは別の場所にデータを保存する仕組みです。 コンテナを消しても、ボリュームが残っていればデータは保持されます。

なぜボリュームが必要なのか

Docker運用では「コンテナは作り直す」が基本です。 しかし業務システムでは、次のデータが消えると致命的です。

  • 顧客データ(DB)
  • 添付ファイル・帳票
  • アップロード画像

このため、DBやファイルストレージはボリュームで永続化します。
つまり「コンテナ=処理」「ボリューム=資産」と役割分担することが重要です。

bind mountは便利だが運用事故が起きやすい

ボリュームには、厳密には2種類あります。

  • Dockerが管理するvolume
  • ホストのディレクトリを直接マウントするbind mount

bind mountは、開発環境では便利です。
しかし本番環境で安易に使うと、次の事故につながります。

  • ホスト側の権限が崩れてアプリが動かない
  • ディレクトリ構成が属人化する
  • バックアップ対象が曖昧になる

本番運用では、基本はDocker volumeを優先し、
必要な場合のみbind mountを採用するのが安全です。

ネットワークとは何か:コンテナ同士を繋ぐ仕組み

Dockerでは、コンテナ同士はネットワークで通信します。 特にWebアプリ構成では、次のような構成が典型です。

  • Web(Nginx)
  • App(PHP)
  • DB(MariaDB)

Dockerのネットワークは「名前解決」が前提

Docker Composeを使う場合、 コンテナ名(サービス名)で通信できる仕組みがあります。

つまり、IPアドレス固定で運用する必要がありません。
これは運用上かなり重要で、クラウド時代の設計思想にも合致します。

ポート公開は最小限にする

Dockerでは、ホストのポートをコンテナに公開する設定ができます。 しかし本番運用では、むやみに公開すべきではありません。

基本方針は次の通りです。

  • 外部公開するのはWeb(Nginx)のみ
  • DBはホストに公開しない
  • 管理用ポートも必要最小限

特に情シス目線では、ポート公開の設計はそのままセキュリティ事故に直結します。

運用目線で押さえるべき「3つの分離」

Dockerを運用で扱うなら、次の3つを分離して考えるのがコツです。

分離1:環境(イメージ)と実行(コンテナ)

環境はイメージで管理し、実行はコンテナで行います。 運用変更は「コンテナを触る」のではなく「イメージを更新する」が基本です。

分離2:処理(コンテナ)とデータ(ボリューム)

データはコンテナの外に置く。 これを守るだけで、Docker運用の事故の多くを回避できます。

分離3:内部通信(ネットワーク)と外部公開(ポート)

内部はDockerネットワークで閉じ、外部公開は最小限にします。 これが、セキュリティと運用安定性を両立させる基本です。

次回予告

次回は、実務で最も利用される形である Docker Compose(複数コンテナ構成)をテーマにします。

  • なぜComposeが必要なのか
  • docker-compose.ymlで何を管理するのか
  • 「動いた」で終わらせないための設計ポイント

を、情シス・現役エンジニア双方に刺さる形で解説します。