docker run nginx 칠 때 일어나는 일
명령어 하나처럼 보이지. 사실은 프로그램 4개가 협업해.
┌─────────────┐ ┌──────────────┐ ┌────────────┐ ┌────────┐
│ Docker CLI │───▶│ dockerd │───▶│ containerd │───▶│ runc │
│ (docker) │ │ (REST daemon)│ │ (lifecycle)│ │ (OCI) │
└─────────────┘ └──────────────┘ └────────────┘ └────────┘각 layer 역할
- Docker CLI (
docker) — 실제로 치는 명령줄 클라이언트. dockerd 랑 unix socket (/var/run/docker.sock) 또는 TCP 로 얘기. - dockerd — 백그라운드 데몬. image, network, volume 관리하고 public Docker REST API 노출. "Docker 재시작" 하면 얘가 재시작.
- containerd — 실제 container 라이프사이클 관리 하는 runtime. image pull, process 시작, namespace 부착. CNCF graduate. Docker 도 쓰고 Kubernetes 도 써.
- runc — low-level OCI compliant runtime. namespace + cgroup 안에 진짜 Linux process 를 spawn. 작아. 지루해. 핵심.
왜 이렇게 layer 가 있어야 하냐
조각 갈아 끼울 수 있거든. Kubernetes 의 kubelet 은 containerd 직접 얘기해. dockerd 건너뛰어. Podman 도 dockerd 안 써 — daemonless 로 runc 직접 부려. OCI 표준이 이 swap 가능성을 만든 거야.