Docker 는 wrapper. 진짜 일은 kernel 이 함
Docker 가 container 를 발명했다고 생각하기 쉬워. 아니야. Linux namespace 는 2002 년부터, cgroup 은 2007 년부터, OverlayFS 는 2014 년부터 있었어. Docker (2013) 는 그것들을 쓸만하게 만든 거 — Git 이 Linus 의 content-addressable storage 를 쓸만하게 만든 거랑 같아.
세 기둥
1. Namespace — 각 process 가 뭘 보냐
각 container 는 자기만의 view 를 받아:
- PID — 자기 process tree (안에서 PID 1 은 앱)
- NET — 자기 network stack (인터페이스, 라우팅, 포트)
- MNT — 자기 filesystem mount
- UTS — 자기 hostname
- IPC — 자기 shared memory, semaphore
- USER — 자기 UID/GID 매핑 (rootless 모드)
2. cgroup — container 가 얼마 쓸 수 있냐
Control Group 은 CPU 셰어, 메모리 한도, block IO 대역폭, cgroup 당 PID 수 를 강제해. 폭주하는 container 가 호스트 다 굶기는 게 아니라 자기 벽에 부딪혀.
3. Union filesystem (OverlayFS) — layered image
Image 는 read-only layer 들의 stack 이야. Container 는 그 위에 얇은 writable layer 를 더해. 같은 base layer? 디스크엔 한 번만 저장되고 여러 container 에 mount. "200MB 이미지" pull 했는데 30MB 만 다운받아지는 게 이거야 — 나머진 이미 있는 거지.