Linux Namespaces - linux namespaces
Linux Namespaces はプロセスごとに「見える世界」を分離する仕組み。PID・Mount・Network・UTS・IPC・User・cgroup の 7 種があり、コンテナのプロセス隔離の中核を担う。
概念図
構文
bash
Namespace の種類と役割
Linux では 7 種類の namespace を組み合わせてコンテナの隔離を作ります。
どれか 1 つが欠けるとホストとコンテナの境界に穴が空きます。
| 種類 | 分離する対象 | 具体例 |
|---|---|---|
| PID | プロセス ID 空間 | コンテナ内の ps で自分のプロセスしか見えない |
| Mount | マウントポイント | / 以下のファイルシステムをコンテナ専用にする |
| Network | NIC・ルーティング・ポート | コンテナ専用の eth0 と IP を持つ |
| UTS | ホスト名・ドメイン名 | hostname をコンテナごとに変える |
| IPC | System V IPC・POSIX 共有メモリ | プロセス間通信チャネルを分離 |
| User | UID・GID マッピング | コンテナ内 root をホスト側の一般ユーザーに対応付け |
| cgroup | cgroup 階層の可視性 | コンテナが自分の cgroup パスしか見えない |
プロセス隔離の実例
コンテナ内で ps -ef を実行すると、コンテナのエントリープロセスが PID 1 として表示されます。
同じプロセスはホスト側から見ると例えば PID 24871 のような通常のプロセスで、/proc/24871/ns/ 配下の各 namespace ID がホストと異なっていることで確認できます。
lsns コマンドを使うと、ホスト上に存在する namespace とそれを使っているプロセスを一覧できます。
コンテナを起動した瞬間に、新しい PID・Mount・Network などの namespace が作成され、エントリープロセスがそこに入れられます。
unshare コマンドで触ってみる
unshare(1) を使うと、Docker を介さずに namespace を直接体験できます。
例えば sudo unshare --pid --fork --mount-proc bash とすると、新しい PID namespace を作ってその中で bash を起動し、ps で PID 1 として自分の bash が見えるようになります。
sudo unshare --uts --fork bash
hostname isolated-test # このシェル内だけホスト名が変わる
exit
hostname # ホスト側は影響を受けない
この挙動を組み合わせたものがコンテナの実体です。
ランタイム(runc 等)は clone(2) に CLONE_NEW* フラグを渡して namespace を一括で作り、その中で指定されたコマンドを exec します。
関連トピック
cgroups- cgroups(Control Groups)はプロセス群の CPU・メモリ・IO などのリソース使用量を制限・計測する Linux カーネルの仕組み。namespace と対になってコンテナの基盤を成す。 OCI spec- OCI はコンテナのイメージ・実行・配布形式を標準化する業界団体。Image Spec / Runtime Spec / Distribution Spec の 3 本柱で、Docker・Podman・containerd などが同じ成果物を扱える。 container vs VM- コンテナと VM はどちらもワークロードを隔離する技術だが、カーネル共有の有無で性能・密度・隔離強度が大きく変わる。用途ごとに使い分ける。 