【入門編】 Linux Namespacesの種類(PID、Network、Mount、IPC、UTS、User、Cgroup)とコンテナ分離機構 – クラウドインフラと仮想化ネットワーク実践ガイド

こんにちは!クラウドインフラやKubernetesの裏側で、日々パケットの旅路を見守っているSREのエンジニアです。

皆さんは普段、Dockerなどのコンテナを使ってアプリを動かしたり、Kubernetesでクラウド上に華麗なマイクロサービスを展開したりしていますよね。「1台のサーバー上で、あたかも自分専用のコンピューターが動いているかのように隔離されている」あの魔法のような仕組み、一体どうなっているか気になったことはありませんか?

「コンテナって、なんだか軽い仮想マシンのようなものなんでしょ?」
そう思っている方にこそ、今日お話しする内容を知っていただきたいのです。実は、コンテナはVMwareのような重たいハイパーバイザー(ハードウェアをごっそりエミュレートする仕組み)を使っていません。その正体は、Linuxカーネルの機能を使って、同じOSの空気を吸いながらも、お互いの存在を見えなくしている「シェアハウスの個室」のようなものなんです。

今回は、そのコンテナ分離機構の心臓部である「Linux Namespaces(ネームスペース)」の世界へ、一歩ずつ優しくご案内していきますね!

—

1. ネームスペースってなぁに?(身近な例えで理解する)

突然ですが、皆さんで巨大なオフィスビルをシェアしているところを想像してください。ビルの中には、何百人もの社員が働いています。

もし、ビル全体の共有フロアで、全員が同じホワイトボードに予定を書き込んだり、同じ内線番号を使おうとしたりしたらどうなるでしょう? 大混乱ですよね。「俺の予定が勝手に消された!」「その内線、さっき俺も使ったんだけど!」と、大喧嘩になってしまいます。

ここで登場するのが、「パーテーション(間仕切り)」です。
各チームごとに専用の部屋を作り、それぞれの部屋に専用のホワイトボードを置き、専用の内線電話を配備する。外から見たら同じビル(1つのLinuxカーネル)にいるのに、部屋の中に入ってしまえば、他の部屋の存在やプライバシーは完全に隠されています。

この「お互いの視界を区切り、自分だけの世界を見せる仕組み」こそが、Linuxの Namespaces(名前空間) なんです!

Linuxカーネルには、このパーテーションの種類がいくつか用意されており、プロセスごとに「どの世界を見せるか」を細かくコントロールできます。それでは、主要な7つのネームスペースを順番に覗いていきましょう!

—

2. 7つのネームスペース:それぞれの役割と世界観

Linuxカーネルが持つ7つのネームスペースは、それぞれ担当する「見せたくないもの」が違います。一歩ずつ、優しく紐解いていきましょう。

① PID (Process ID) ネームスペース:お隣さんの顔が見えない個室

  • 何をするもの?: プロセスID(PID)を隔離します。
  • 現実世界の例: アパートの各部屋の「住人番号」。
  • 解説: 普通のLinuxだと、システム全体で動いているすべてのプロセスの番号(PID 1, 2, 3…)が見えますよね。でも、PIDネームスペースで区切られた空間に入ると、その空間の中で起動した最初のプロセスが誇り高く 1 番(initプロセス)を名乗ることができます。自分の部屋から一歩も外に出られないので、ホストOS側で何が動いているのか、知るよしもありません。

② Network ネームスペース:専用のネットワークカードと配線

  • 何をするもの?: IPアドレス、ルーティングテーブル、iptables、ネットワークインターフェース(eth0 など)を隔離します。
  • 現実世界の例: 各部屋に引き込まれた専用のWi-FiルーターとLANケーブル。
  • 解説: 私たちインフラエンジニアにとって最も馴染み深いのがこれです。「コンテナごとに異なるIPアドレスを持たせる」ことができるのは、このNetworkネームスペース(通称: netns)のおかげです。コンテナの中に入れば、127.0.0.1 は自分だけのループバックアドレスになり、ホストOSとは独立したネットワーク世界が広がります。

③ Mount ネームスペース:自分専用の本棚とクローゼット

  • 何をするもの?: ファイルシステムのマウントポイントを隔離します。
  • 現実世界の例: 自分専用の鍵付きクローゼット。
  • 解説: あるコンテナの中からは /app というディレクトリが見えていても、別のコンテナからは全く見えない、あるいは違う中身が見える。これは、ファイルシステムのマウント状態をコンテナごとに独立させているからです。根っこ(Root)のディレクトリをすげ替える chroot の超強力・進化版とイメージしてください。

④ IPC (Inter-Process Communication) ネームスペース:独自の伝言板

  • 何をするもの?: 共有メモリやメッセージキューなど、プロセス間の通信手段を隔離します。
  • 現実世界の例: 部屋の住人同士だけで回覧板。
  • 解説: 同じOS上であっても、関係のないプロセス同士が勝手にメモリを覗き見合ったり、メッセージを送り合ったりできないように隔離します。セキュリティを保つために非常に重要な役割を持っています。

⑤ UTS (UNIX Timesharing System) ネームスペース:自分だけの表札

  • 何をするもの?: ホスト名(Hostname)とドメイン名を隔離します。
  • 現実世界の例: 玄関の表札。
  • 解説: 「ホスト名を変えたら、すべてのアプリに影響が出ちゃった!」なんて事故を防ぎます。コンテナごとに「うちは web-server-01 です」「うちは db-server-01 です」と、自由な表札を掲げることができます。

⑥ User ネームスペース:部屋の中では「王様」、外では「一般人」

  • 何をするもの?: ユーザーID(UID)とグループID(GID)をマッピング・隔離します。
  • 現実世界の例: テーマパークの「園内通貨」。
  • 解説: これがまた面白い仕組みです。コンテナの中では誰もが権限を持った root ユーザーとして振る舞えるのに、一歩ホストOS側に戻ると、権限の無いただの「一般ユーザー」として扱われます。これにより、万が一コンテナが破られても、ホストOSの根幹を乗っ取られるリスクを劇的に減らすことができます(セキュリティの要です!)。

⑦ Cgroup ネームスペース:使える資源の割り当て(※厳密にはCgroupsと連動)

  • 何をするもの?: コントロールグループ(Cgroups)のビューを隔離します。
  • 現実世界の例: 各部屋に割り当てられた電気のアンペア数。
  • 解説: 「このコンテナはメモリを最大512MBまでしか使っちゃダメ!」といったリソース制限の視点を管理します。

—

3. 手を動かして体感しよう! Linux Namespacesの魔法

「百聞は一見にしかず」です。実際にLinuxのコマンドを使って、このネームスペースの魔法を自分の手で体験してみましょう!
(※手元にLinux環境、またはWSL2などがあれば試せます。実行には root 権限が必要です)

① まずは今のネットワークの世界を覗いてみる

まずは、今あなたの手元にあるホストOSのネットワークインターフェースを見てみましょう。

# ホストOS側でネットワーク一覧を確認する
ip link show

おそらく、eth0 や wlan0、lo(ループバック)などがずらりと並んでいるはずです。

② 新しい Network ネームスペースを作ってみる

それでは、ip netns コマンドを使って、新しいネットワークの「個室(ネームスペース)」を作ってみましょう。名前は sample-ns にします。

# 新しいネットワークネームスペース「sample-ns」を作成する
ip netns add sample-ns

# 作成されたネームスペースの一覧を確認する
ip netns list

これだけで、もうシステム内に独立した別のネットワーク世界が誕生しました!

③ 新しい部屋の中に飛び込んでみる

では、作成した sample-ns という部屋の中に移動して、ネットワークの状態を確認してみましょう。ip netns exec を使います。

# 「sample-ns」の世界に入り込んで、ループバックアドレス(lo)だけを確認する
ip netns exec sample-ns ip link show

どうでしょう? 先ほどホストOSで見た賑やかなネットワークインターフェースたちはどこへやら、見事に lo(ループバック)しか存在しない、真っさらな静寂の世界が広がっているはずです。これが、Networkネームスペースの隔離マジックです!

—

4. コンテナ技術の正体:Namespaces × Cgroups

ここまで読んでお気づきの方も多いはずです。
そう、私たちが普段何気なく使っている Dockerなどのコンテナ技術は、特別な仮想化ハードウェアを使っているわけではありません。

Linuxカーネルが持つ機能である、
1. Namespaces(見えている世界をすっかり分ける:PID, Net, Mount, UTS…)
2. Cgroups(使えるCPUやメモリの量をガチガチに制限する)

この2つの強力なタッグによって、「まるで独立した1台のサーバーが動いているかのように見せかけている」だけなのです。OSのカーネルをみんなでシェアしているからこそ、仮想マシン(VM)に比べて起動が圧倒的に速く、メモリも無駄に食わないという素晴らしいメリットが生まれます。

Kubernetesのポッド(Pod)が複数のコンテナでネットワークを共有できる(localhost で通信できる)のも、このネットワークネームスペースの技術を巧みに操っているからなんですよ。

—

まとめ:インフラの裏側を知ると、クラウドはもっと楽しくなる!

今回は、コンテナの根底を支える「Linux Namespaces」の世界を、郵便配達やシェアハウスの例えを交えてお話ししました。

  • コンテナは重たい仮想マシンではなく、カーネルの機能による「見事な個室のパーテーション」である。
  • PIDやNetwork、Mountなど、7つのネームスペースがそれぞれの世界を隔離している。
  • コマンド一つでその隔離空間は簡単に作って覗き見ることができる。

普段私たちが何気なく叩いている docker run や、Kubernetesの kubectl apply の裏側では、こうしたLinuxカーネルの枯れた、しかし最高にクールな技術が秒速で何本も動いています。

「なんだかクラウドやKubernetesのネットワークって難しそう…」と思っていた方も、パケットやプロセスが走る「個室」のイメージを持てたなら、明日からのインフラ運用の景色が少し違って見えてくるのではないでしょうか?

一歩ずつ、確実に。一緒にインフラ・SREの深淵を楽しんでいきましょう!それではまた次回の技術解説でお会いしましょう!

コメント

タイトルとURLをコピーしました