【なまえくうかん】

名前空間 とは?

💡 名前の「住所」をつけて衝突を防ぐ仕組み
📌 このページのポイント
名前空間の概念 名前空間A: app.models class User class Config app.models.User 名前空間B: api.models class User class Config api.models.User 衝突なし 名前空間なし class User class User 名前が衝突! どのUserか不明 Linux名前空間(コンテナ隔離) ホストOS コンテナA PID: 1, Net: 10.0.0.1 コンテナB PID: 1, Net: 10.0.0.2 PID ns Net ns Mnt ns User ns |
名前空間の概念
ひよこ ひよこ

名前空間ってなぜ必要なの?

ペンギン先生 ペンギン先生

たとえば君がutilsという関数を作ったとして、使っているライブラリにもutilsという名前があったら、どっちのutilsを使えばいいかわからなくなるよね。名前空間があれば「myapp.utils」と「library.utils」のように区別できるんだ。同じ名前のファイルでもフォルダが違えば共存できるのと同じ発想だよ。

ひよこ ひよこ

おもしろい!プログラミング言語ではどう書くの?

ペンギン先生 ペンギン先生

言語によって書き方が違うよ。C++なら「namespace MyApp { ... }」、Javaなら「package com.myapp;」、Pythonならモジュール(ファイル)自体が名前空間になる。JavaScriptではES Modulesのimport/exportが名前空間の役割を果たしているんだ。

ひよこ ひよこ

名前空間で気をつけることってある?

ペンギン先生 ペンギン先生

名前空間が深すぎると使うときに長くなって面倒になるよ。「com.company.project.module.submodule.ClassName」みたいな。だから適度な深さに抑えるのがコツ。あとPythonでは「from xxx import *」で名前空間を無視して全部インポートする書き方があるけど、これは名前衝突の原因になるから避けるべきとされているよ。

ひよこ ひよこ

Kubernetesでも名前空間って使うの?

ペンギン先生 ペンギン先生

使うよ!Kubernetesの名前空間は、同じクラスタ内でリソースを論理的に分離する仕組みなんだ。例えば「development」「staging」「production」という名前空間を作って、環境ごとにPodやServiceを分離できる。同じ名前のリソースでも名前空間が違えば共存できるよ。

ひよこ ひよこ

プログラミングの名前空間とKubernetesの名前空間って考え方は同じなんだね!

ペンギン先生 ペンギン先生

そうそう。「同じ名前が衝突しないようにスコープを分ける」という本質は同じ。実はLinuxカーネルにもnamespaceの概念があって、Dockerコンテナ分離はこのLinux namespaceで実現されているんだ。ネットワークプロセスID、ファイルシステムなどをコンテナごとに隔離しているんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「名前空間」って出てきたら「名前の衝突を防ぐためにグループ分けする仕組みだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「namespace」 = 名前の空間
💬 同じ「田中さん」でも「営業部の田中さん」と「開発部の田中さん」を区別するのと同じ発想だよ
← 用語集にもどる