Dock Stay
Linux Namespaces - linux namespaces の使い方・オプション・サンプル

Linux Namespaces - linux namespaces

Linux Namespaces はプロセスごとに「見える世界」を分離する仕組み。PID・Mount・Network・UTS・IPC・User・cgroup の 7 種があり、コンテナのプロセス隔離の中核を担う。

概念図

linux namespaces diagram

構文

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 します。

関連トピック