Docker나 Kubernetes를 공부하다 보면 반드시 등장하는 개념이 Namespace입니다. 많은 사람들이 Docker가 독립적인 운영체제를 실행한다고 생각하지만, 실제로는 하나의 Linux Kernel을 여러 컨테이너가 함께 사용합니다.
그럼에도 각 컨테이너는 자신만의 프로세스, 네트워크, 파일 시스템을 가진 것처럼 동작합니다. 이러한 격리(Isolation)를 가능하게 하는 핵심 기술이 바로 Linux Namespace입니다.
Namespace는 Linux Kernel이 제공하는 기능으로, 프로세스마다 시스템 자원을 서로 다른 공간처럼 보이게 만들어 독립적인 실행 환경을 제공합니다.
이번 글에서는 Namespace의 개념과 동작 원리, 종류, Docker와 Kubernetes에서 어떻게 활용되는지 자세히 알아보겠습니다.
Linux Namespace란?
Namespace는 프로세스가 시스템 자원을 독립적으로 바라보도록 격리하는 Linux Kernel 기능입니다.
동작 구조는 다음과 같습니다.
Linux Kernel
↓
Namespace
↓
Container A
Container B
Container C
↓
각각 독립된 환경
실제로는 하나의 Kernel을 공유하지만, 각 컨테이너는 자신만의 시스템처럼 인식합니다.
Namespace가 필요한 이유
예를 들어 하나의 서버에서 여러 개의 웹 서비스를 실행한다고 가정해 보겠습니다.
Namespace가 없다면
- 프로세스 목록 공유
- 네트워크 공유
- 마운트 정보 공유
- IPC 공유
등으로 인해 서로 영향을 주게 됩니다.
Namespace를 사용하면
Container A
↓
독립된 PID
독립된 Network
독립된 Mount
↓
다른 컨테이너와 완전 분리
와 같이 동작합니다.
Namespace 종류
Linux는 여러 종류의 Namespace를 제공합니다.
| Namespace | 역할 |
|---|---|
| PID | 프로세스 격리 |
| Network | 네트워크 격리 |
| Mount | 파일 시스템 격리 |
| UTS | Hostname 격리 |
| IPC | 프로세스 간 통신 격리 |
| User | 사용자 및 권한 격리 |
| Cgroup | cgroup 정보 격리 |
| Time | 시간 관련 정보 격리(Linux 5.6+) |
각 Namespace는 독립적으로 사용할 수도 있고 함께 사용할 수도 있습니다.
PID Namespace
PID Namespace는 프로세스 번호(PID)를 분리합니다.
예를 들어 컨테이너 내부에서는
PID 1
↓
nginx
처럼 보이지만,
호스트에서는
PID 34872
↓
docker-container
처럼 다른 PID를 가질 수 있습니다.
컨테이너 내부에서는 자신이 시스템 전체의 첫 번째 프로세스처럼 동작합니다.
Network Namespace
Network Namespace는 네트워크 장치를 독립적으로 제공합니다.
각 컨테이너는
- 독립 IP
- 독립 Routing Table
- 독립 Firewall
- 독립 Port
를 사용할 수 있습니다.
확인
ip netns
Docker 역시 내부적으로 Network Namespace를 생성하여 컨테이너를 분리합니다.
Mount Namespace
Mount Namespace는 파일 시스템을 격리합니다.
예를 들어
Container A
/
↓
/etc
/var
/app
Container B
/
↓
/etc
/var
/data
서로 다른 디렉터리 구조를 가질 수 있습니다.
실제로는 동일한 Kernel을 사용하지만 파일 시스템은 독립적으로 관리됩니다.
UTS Namespace
UTS Namespace는 Hostname과 Domain Name을 분리합니다.
예를 들어
컨테이너 A
hostname
↓
web01
컨테이너 B
hostname
↓
db01
같은 서버에서도 서로 다른 Hostname을 사용할 수 있습니다.
IPC Namespace
IPC Namespace는 프로세스 간 통신(Inter Process Communication)을 격리합니다.
다음 자원을 분리합니다.
- Shared Memory
- Semaphore
- Message Queue
서로 다른 컨테이너의 프로세스는 IPC를 공유하지 않습니다.
User Namespace
User Namespace는 사용자 권한을 분리합니다.
예를 들어
컨테이너 내부에서는
root
로 실행되더라도
호스트에서는
UID 100000
등 일반 사용자로 매핑될 수 있습니다.
이 기능은 컨테이너 보안을 크게 향상시킵니다.
Namespace 확인
현재 Namespace는 다음 명령으로 확인할 수 있습니다.
lsns
예시
NS
TYPE
PID
COMMAND
Namespace 목록과 연결된 프로세스를 확인할 수 있습니다.
특정 프로세스 Namespace 확인
ls -l /proc/PID/ns
예시
mnt
pid
net
ipc
uts
user
프로세스가 사용하는 Namespace 정보를 확인할 수 있습니다.
새로운 Namespace 생성
간단한 테스트는 unshare 명령으로 가능합니다.
sudo unshare --pid --fork bash
새로운 PID Namespace에서 Bash를 실행합니다.
Hostname Namespace 생성
sudo unshare --uts bash
새로운 Hostname 공간이 생성됩니다.
Docker와 Namespace
Docker는 컨테이너 생성 시 다음 기능을 사용합니다.
Docker
↓
Namespace
+
cgroups
↓
Container
Namespace는 격리를 담당하고,
cgroups는 CPU, 메모리 등의 자원을 제한합니다.
두 기술이 함께 동작하여 컨테이너를 구현합니다.
Kubernetes와 Namespace
Kubernetes의 Pod 역시 Linux Namespace를 사용합니다.
일반적으로 하나의 Pod 내부 컨테이너는
- Network Namespace 공유
- IPC 공유
- Volume 공유
하지만 서로 다른 Pod는 독립된 Namespace를 가집니다.
실무에서 자주 사용하는 명령어
Namespace 확인
lsns
프로세스 Namespace 확인
ls -l /proc/PID/ns
Network Namespace 확인
ip netns
새로운 PID Namespace 생성
sudo unshare --pid --fork bash
새로운 UTS Namespace 생성
sudo unshare --uts bash
현재 Hostname 확인
hostname
실무 사례
예를 들어 하나의 서버에서 동일한 Nginx 애플리케이션을 여러 개 실행해야 하는 경우를 생각해 보겠습니다.
Namespace가 없다면 프로세스와 포트 충돌이 발생할 수 있습니다.
Docker는 각 컨테이너마다 PID, Network, Mount Namespace를 생성하여 서로 영향을 주지 않도록 격리합니다.
관리자는 lsns 명령으로 현재 Namespace를 확인하고, unshare를 이용해 테스트 환경을 구성할 수 있습니다.
자주 묻는 질문
Namespace와 cgroups의 차이는 무엇인가요?
Namespace는 격리(Isolation) 를 담당하고, cgroups는 자원 제한(Resource Control) 을 담당합니다. Docker는 두 기능을 함께 사용하여 컨테이너를 구성합니다.
Namespace만 사용하면 컨테이너를 만들 수 있나요?
아닙니다. Namespace는 격리 기능만 제공합니다. 실제 컨테이너 환경을 만들기 위해서는 cgroups, OverlayFS, Capabilities, Seccomp 등의 기술도 함께 사용됩니다.
PID Namespace에서 PID 1은 특별한 의미가 있나요?
있습니다. PID Namespace 내부의 PID 1은 해당 Namespace의 초기 프로세스로, 종료되면 해당 Namespace 내부의 다른 프로세스들도 함께 종료될 수 있습니다. 그래서 컨테이너에서는 PID 1 프로세스의 역할이 매우 중요합니다.
마무리
Linux Namespace는 하나의 Kernel을 공유하면서도 프로세스, 네트워크, 파일 시스템, 사용자 정보 등을 독립적으로 격리하는 핵심 기술입니다. Docker와 Kubernetes는 Namespace와 cgroups를 함께 활용하여 안전하고 효율적인 컨테이너 환경을 제공합니다. Namespace의 구조와 종류를 이해하면 컨테이너 기술의 동작 원리를 훨씬 쉽게 이해할 수 있으며, 실무에서도 문제 해결과 성능 분석에 큰 도움이 됩니다.