はじめに
Linux Namespaces: 見える世界を分ける
コンテナ隔離の中核、Linux Namespaces の 7 種類(PID / Mount / Network / UTS / IPC / User / cgroup)と、ホスト上で確認する方法。
7 種類の Namespace
コンテナの隔離の中核が Linux Namespaces です。
プロセスごとに「見える世界」を切り替える仕組みで、現在 7 種類あります。
| Namespace | 何を隔離するか |
|---|---|
| PID | プロセス ID。コンテナ内の PID 1 はホストでは別の PID |
| Mount | マウントポイント。コンテナのルート / はホストのサブツリー |
| Network | ネットワークインターフェース・ルーティング・ポート |
| UTS | ホスト名・ドメイン名 |
| IPC | 共有メモリ・セマフォ |
| User | UID / GID のマッピング(rootless の鍵) |
| cgroup | cgroup 階層の見え方 |
どれか 1 つが欠けるとホストとコンテナの境界に穴が空きます。
ホストから namespace を見る
lsns コマンドでホスト上の namespace を一覧できます。
特定のプロセスがどの namespace に属しているかは /proc/<pid>/ns/ 配下のシンボリックリンクで確認できます。
コンテナを起動した瞬間に新しい PID・Mount・Network などの namespace が作成され、エントリープロセスがそこに入れられます。
ホスト側から見ると、コンテナのエントリープロセスは通常の PID を持つ 1 プロセスですが、/proc/<pid>/ns/pid がホストと異なる inode を指します。
bash
# ホスト上の namespace を一覧する
lsns
# 特定プロセスが属する namespace を見る
ls -l /proc/$(pgrep -n nginx)/ns/