컨테이너에서 namespace와 cgroup은 어떤 역할을 하나요?
답변 포인트
격리와 자원 제한의 분리를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
namespace는 프로세스가 보는 PID, 네트워크, 파일시스템 등을 격리하고, cgroup은 CPU와 메모리 같은 자원 사용량을 제한하고 측정합니다. 실무 예시: 운영체제 이슈는 재현이 어려운 경우가 많아 실행 흐름과 자원 소유 관계를 그림처럼 정리하면 원인 분석이 쉬워집니다.
컨테이너는 가상 머신처럼 별도 커널을 띄우는 것이 아니라, 같은 커널 위에서 프로세스를 격리하고 자원 사용량을 제한합니다. 이때 핵심이 namespace와 cgroup입니다.
namespace: 무엇을 볼 수 있는가
Namespace는 프로세스가 바라보는 시스템 자원의 “시야”를 분리합니다. 같은 호스트에서 실행되더라도 컨테이너 안에서는 독립된 PID, 네트워크, 파일 시스템처럼 보일 수 있습니다.
| namespace | 격리 대상 | 예시 |
|---|---|---|
| PID | 프로세스 ID 공간 | 컨테이너 안의 앱이 PID 1로 보임 |
| NET | 네트워크 인터페이스/라우팅 | 컨테이너별 IP, 포트 |
| MNT | 마운트 포인트 | 컨테이너별 root filesystem |
| UTS | hostname/domain | 컨테이너 hostname |
| IPC | 공유 메모리/세마포어 | 프로세스 간 통신 격리 |
| USER | UID/GID 매핑 | 컨테이너 root와 호스트 root 분리 |
docker run --rm alpine sh -c 'hostname && ps aux'컨테이너 안에서 보는 프로세스 목록은 호스트 전체가 아니라 해당 PID namespace 기준입니다.
cgroup: 얼마나 쓸 수 있는가
Cgroup(control group)은 CPU, 메모리, I/O, pids 같은 자원 사용량을 제한하고 측정합니다.
docker run --memory=256m --cpus=0.5 nginx이 설정은 nginx 컨테이너가 메모리 256MB와 CPU 0.5개 정도의 quota 안에서 동작하도록 제한합니다. 제한을 넘으면 CPU throttling이 발생하거나 OOM kill이 날 수 있습니다.
둘의 차이
namespace = 격리된 것처럼 보이게 한다
cgroup = 실제 사용 가능한 자원의 한계를 정한다예를 들어 컨테이너는 독립된 네트워크 인터페이스를 보는 동시에(namespace), CPU는 1 core 이하로 제한될 수 있습니다(cgroup).
실무에서 주의할 점
- 컨테이너 안에서 root여도 호스트 root와 같다고 가정하면 위험합니다. USER namespace, capability, seccomp까지 함께 봐야 합니다.
- 메모리 제한이 낮으면 JVM/Node.js가 호스트 메모리를 기준으로 heap을 잡아 OOM이 날 수 있습니다.
- CPU quota가 낮으면 평균 CPU 사용률이 낮아 보여도 latency가 튈 수 있습니다.
- PID 1 프로세스는 signal 처리와 좀비 프로세스 reap 책임이 있으므로
tini같은 init 사용을 고려합니다.
면접 답변 포인트
“namespace는 컨테이너가 보는 시스템 자원을 격리하고, cgroup은 CPU/메모리 같은 자원 사용량을 제한·계측합니다. 컨테이너는 이 둘을 조합해 프로세스 격리와 리소스 제어를 구현합니다.”라고 정리하면 됩니다.