Docker Deep Dive: 仕組みとアーキテクチャ
1. 全体像と抽象化レイヤー (System Overview)
本プロジェクトにおける開発環境から実行環境までのレイヤー構成を図解します。
なぜ Docker は軽量なのか?
仮想マシン (VM) サーバー全体を仮想化するのに対し、Docker コンテナは ホスト OS(ここでは Debian Guest)のカーネルを共有 します。
- Virtual Machine: 各 VM に完全な OS (カーネル含む) が必要。オーバーヘッドが大きい。
- Container: プロセスとして動作し、名前空間 (Namespace) と cgroups で隔離されているだけ。起動はプロセス起動と同等の速さ。
2. Docker イメージとビルドプロセス
イメージ作成からコンテナ実行までの流れを解説します。
イメージレイヤーの概念
Docker イメージは、変更差分の積み重ね(レイヤー)でできています。
- Base Image:
debian:bullseye(OSのファイルシステム) - Layer 1:
apt-get install ...(変更分のみ保存) - Layer 2:
COPY . .(ソースコード)
これにより、nginx と wordpress が同じ debian:bullseye をベースにしている場合、ベース部分はディスク上で共有され、さらに効率化されます。
3. Docker Compose の仕組み
docker-compose.yml は、複数のコンテナの関係性(ネットワーク、ボリューム、起動順序)を定義する「設計図」です。 make コマンドで実行される docker compose up の裏側では、以下の順序でリソースが作成されます。
ネットワーク (Bridge Network)
networks: inception を定義することで、Docker は内部 DNS サーバーを立ち上げます。 これにより、コンテナは「IPアドレス」ではなく「サービス名 (wordpress, mariadb)」でお互いを発見 (Service Discovery) できます。
ボリューム (Bind Mounts)
本プロジェクトでは、driver_opts を使用してホストのディレクトリ (/home/user/data/...) を直接マウントしています。
- Host:
/home/user/data/wordpress - Container:
/var/www/htmlこれが「窓」のように機能し、コンテナが削除されてもホスト側にデータが残る「永続化」を実現しています。
4. 開発者(あなた)と環境の関係
この図が示す通り、あなたはホストマシンから SSH 経由で Docker Engine を操作し、同時にブラウザからポート転送経由で Web サービスにアクセスしています。 Docker はこの複雑な環境を「コンテナ」という単位でカプセル化し、環境差異を吸収しています。