Namespaces + Cgroups = 컨테이너 격리의 기반
이 두 개를 이해하면 "컨테이너가 어떻게 격리되는지"와 "Docker / K8s가 왜 가능한지"를 완전히 이해하게 됨
| Namespace | 역할 | 예시 |
|---|---|---|
| PID | 프로세스 번호(PID) 분리 | 컨테이너 내부에서는 자신이 PID 1 |
| Mount (mnt) | 파일 시스템 격리 | 다른 루트 파일시스템 (/) 사용 가능 |
| UTS | 호스트 이름 분리 | 컨테이너마다 hostname 다름 |
| IPC | IPC 자원 (Message Queue, Shared Memory) 분리 | 메시지큐 충돌 없음 |
| Network | 네트워크 스택(인터페이스, 라우팅) 분리 | 각 컨테이너 eth0 따로 |
| User | UID/GID 격리 | root처럼 보여도 실제 호스트에선 일반 사용자 |
| Cgroup | 자원 제한과 관리 (Namespaces와 함께 동작하지만 분류상 별도 가능) | CPU 20%만 사용 |
즉, "동일한 Linux kernel 위에서 가짜 환경을 여러 개 만들어주는 기술"
리눅스에서는 unshare로 직접 namespace를 만들어 볼 수 있다
sudo unshare --pid --fork --mount-proc bash
ps -ef # bash pid가 1로 보임, 즉 프로세스 트리가 신규 환경처럼 보임
Namespace가 "보이는 세게"를 분리하는 것이라면, Cgroups은 실제 리소스를 제한하고 관리하는 기술이다
예 : 메모리를 100MB로 제한
mkdir /sys/fs/cgroup/mygroup
echo 10000000 > /sys/fs/cgroup/mygroup/memory.max
echo <pid> > /sys/fs/cgroup/mygroup/cgorup.procs
-> pid 프로세스는 100MB 이상 메모리를 사용하면 OOM 발생
도커가 하는 일은 사실 리눅스 커널의 기능을 "편하게 쓰도록" 래핑한 것이다
그래서 결론적으로
컨테이너 = Namespace (격리) + Cgroup (자원제한) + Filesystem Overlay (루트FS) Docker는 이걸 자동으로 만들어주는 도구
Namespace가 없으면:
/proc 접근 가능Namespace를 사용하면:
즉, 컨테이너는 가상머신처럼 보안적으로 분리되지만 훨씬 가볍다