Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:プロセスとサービス管理(systemd) | 関連:DockerイメージとレイヤKubernetesの全体像(宣言的・調整ループ)

要点(BLUF)

概念 ── 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)=見える範囲の隔離:プロセスから見える世界を区切ります。

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 で「コンテナの中からはホストのプロセスが見えない」ことを体感できます。これが名前空間の効果です。

なぜコンテナなのか

⚠️ よくある誤解・落とし穴

対応ラボ

なし(概念トピック)。実際にイメージを作る手は次の Dockerイメージとレイヤ の Dockerfile ラボで。

関連

第3章 コンテナ 目次