Namespace (przestrzeń nazw) to mechanizm jądra Linux, który izoluje globalne zasoby systemu tak, by grupa procesów widziała tylko swój własny, prywatny wycinek świata. Proces wewnątrz namespace ma wrażenie, że dostał cały system na wyłączność — własną listę procesów, własne interfejsy sieciowe, własne punkty montowania — choć fizycznie siedzi na tym samym jądrze co reszta. To właśnie ta sztuczka, w parze z cgroups (limitowanie zasobów), tworzy fundament konteneryzacji w Dockerze, Podmanie czy Kubernetesie.
Jak to działa
Linux nie ma jednego namespace, tylko kilka rodzajów, każdy izolujący inny zasób. Najważniejsze to: PID (numeracja procesów — w kontenerze pierwszy proces dostaje PID 1), NET (interfejsy, tablice routingu, porty), MNT (punkty montowania), UTS (hostname), IPC (kolejki komunikatów, pamięć współdzielona), USER (mapowanie UID/GID — root w kontenerze może być zwykłym userem na hoście) oraz nowsze cgroup i time.
Pod spodem działają trzy wywołania systemowe: clone() tworzy nowy proces od razu w świeżych namespace’ach (flagi CLONE_NEWNET, CLONE_NEWPID itd.), unshare() odłącza bieżący proces od współdzielonych przestrzeni, a setns() wpina istniejący proces do już istniejącego namespace. Same namespace żyją w /proc/ jako dowiązania — i istnieją dopóty, dopóki coś je trzyma.
Przykład z praktyki
Nie potrzebujesz Dockera, żeby pobawić się namespace. Wystarczy unshare z pakietu util-linux. Odpal własny network namespace z osobnym hostname:
sudo unshare --net --uts --pid --fork --mount-proc bash
W nowej powłoce ip addr pokaże tylko interfejs lo (i to wyłączony), a ps aux — garstkę procesów zamiast całego systemu. To dokładnie ten sam mechanizm, którego używa docker run. Listę wszystkich namespace w systemie podejrzysz komendą lsns, a nsenter -t pozwala „wejść” do sieci konkretnego kontenera w celach debugowania.
Na co uważać
Najczęstszy mit: „namespace = bezpieczna piaskownica jak maszyna wirtualna”. Nie. To izolacja widoczności, nie pełna granica bezpieczeństwa — wszystkie kontenery dzielą jedno jądro, więc luka w kernelu potrafi przebić tę ścianę. Drugi błąd to mylenie namespace z cgroups: namespace decyduje co widzisz, cgroups ile możesz zużyć. To dwie różne rzeczy, które dopiero razem dają kontener. Pamiętaj też, że namespace znika, gdy ostatni proces go opuści — chyba że trzymasz go bind-mountem.
Pojęcia powiązane: cgroups, kontenery, Docker, container runtime (runc), capabilities, chroot, seccomp, wywołanie systemowe clone.