🎓 レベル:基礎 | 重要度:A(必須)
📎 前提:プロセスとサービス管理(systemd) | 関連:Dockerイメージとレイヤ・Kubernetesの全体像(宣言的・調整ループ)
要点(BLUF)
- コンテナ=Linux の名前空間と cgroups で隔離した、ただのプロセス。OS を丸ごと積む VM と違い、ホストのカーネルを共有するから軽くて速い。
- 名前空間(namespaces)=「見える範囲」を区切る(プロセス・ネットワーク・ファイルシステムが互いに見えない)。cgroups=「使える量」を区切る(CPU・メモリの上限)。
- 利点は「どこでも同じように動く」再現性と、起動の速さ・密度。「自分の環境では動いた」問題を構造的に消す。
概念 ── VM とコンテナの違い
両方とも「隔離された実行環境」ですが、隔離の深さが違います。
flowchart TB
subgraph vm["仮想マシン(VM)"]
vh["ホストOS+ハイパーバイザ"]
vg1["ゲストOS A(フルOS)→ アプリA"]
vg2["ゲストOS B(フルOS)→ アプリB"]
vh --> vg1
vh --> vg2
end
subgraph ct["コンテナ"]
ch["ホストOS(カーネルを共有)"]
cc1["コンテナA(アプリ+依存だけ)"]
cc2["コンテナB(アプリ+依存だけ)"]
ch --> cc1
ch --> cc2
end
VM はゲストOSを丸ごと載せるので重い(起動は分単位・GB単位)。コンテナはカーネルを共有しアプリと依存だけを包むので軽い(起動は秒以下・MB単位)。1台のサーバに何十倍も詰め込めるのが密度の差です。
| 仮想マシン | コンテナ | |
|---|---|---|
| 隔離 | ハードごと仮想化(強い) | プロセス隔離(OSは共有) |
| 起動 | 分単位 | 秒以下 |
| サイズ | GB級 | MB級 |
| カーネル | ゲストごと独立 | ホストと共有 |
| 用途 | 強い隔離・別OS | 高密度・高速・再現性 |
VM とコンテナのOS理論としての詳細(仮想化方式)は コンピュータ基礎 へ。
仕組み ── 名前空間と cgroups
コンテナは魔法ではなく、Linux カーネルの2機能の組み合わせです。
名前空間(namespaces)=見える範囲の隔離:プロセスから見える世界を区切ります。
- PID 名前空間:コンテナ内のプロセスには自分のプロセスしか見えない(自分が PID 1 に見える)
- ネットワーク名前空間:自分専用のIP・ポート空間
- マウント名前空間:自分専用のファイルシステムの見え方
- UTS / IPC / user 名前空間:ホスト名・プロセス間通信・ユーザーIDの隔離
cgroups(control groups)=使える量の制限:CPU・メモリ・I/O の上限を課す。1つのコンテナが暴走してホスト全体を巻き込むのを防ぎます。
flowchart LR
proc["普通のプロセス"] --> ns["名前空間で『見える範囲』を隔離"]
ns --> cg["cgroups で『使える量』を制限"]
cg --> container["= コンテナ"]
つまりコンテナは「隔離された見え方+制限された資源を与えられたプロセス」。だから systemd で常駐させるプロセス(プロセスとサービス管理(systemd))の延長線上にあります。
動く例 ── 最初の一歩
# イメージを取得して、コンテナとして実行(-d はバックグラウンド)
docker run -d --name web -p 8080:80 nginx
# 動いているコンテナ一覧
docker ps
# 中に入ってプロセスを見る → 自分のプロセスしか見えない(PID名前空間)
docker exec -it web ps aux
# メモリ上限を課す(cgroups)。512MBを超えたら制限される
docker run -d --memory=512m --name limited nginx
# 後片付け
docker rm -f web limited
docker exec ... ps aux で「コンテナの中からはホストのプロセスが見えない」ことを体感できます。これが名前空間の効果です。
なぜコンテナなのか
- 再現性のため:アプリと依存(ライブラリ・設定)を1つの箱に固めるので、開発・テスト・本番で同じものが動く。環境差由来のバグが消える。
- 速さと密度のため:OS を積まないので起動が速く、1台に多数詰め込める。オートスケール(コストとスケーリングの考え方)と相性が良い。
- 使い捨て(immutable)にできるため:壊れたら作り直す。サーバを直すのでなく置き換える運用(構成管理とImmutable Infrastructure)の単位になる。
⚠️ よくある誤解・落とし穴
- 「コンテナは軽量VM」→ 違う。VMはOSごと仮想化、コンテナはカーネル共有のプロセス隔離。だからホストと別OSのカーネルは動かせない(Linux コンテナはLinuxカーネル前提)。
- 「コンテナは完全に安全に隔離されている」→ カーネルは共有なので、VMほど強い隔離ではない。マルチテナントの強隔離やコンテナセキュリティの深掘りは サイバーセキュリティ へ。
- 「コンテナにデータを入れて永続化」→ コンテナは使い捨て前提。消えると中のデータも消える。永続化はボリューム(コンテナのネットワークとボリューム)。
- 「1コンテナに何でも詰める」→ 原則1コンテナ1プロセス(1責務)。Web・DB・ジョブは分ける(Docker Composeで複数コンテナ)。
対応ラボ
なし(概念トピック)。実際にイメージを作る手は次の Dockerイメージとレイヤ の Dockerfile ラボで。
関連
- 箱(イメージ)の作り方は Dockerイメージとレイヤ
- データを残す・外とつなぐは コンテナのネットワークとボリューム
- 常駐プロセスの管理という土台は プロセスとサービス管理(systemd)
- 多数のコンテナを本番で束ねるのは Kubernetesの全体像(宣言的・調整ループ)