C.W.K.
Stream
Lesson 05 of 07 · published

Engine 아키텍처 — CLI, dockerd, containerd, runc

~14 min · foundations, architecture

Level 0Container 호기심
0 XP0/36 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

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 가능성을 만든 거야.

Code

돌아가는 호스트에서 layer 보기·bash
# The processes
ps -ef | grep -E 'dockerd|containerd|runc' | grep -v grep

# A typical Linux host:
# root   1234  ... /usr/bin/dockerd
# root   1245  ... /usr/bin/containerd
# (runc is short-lived — it forks the container and exits)

# CLI talks to daemon via unix socket
ls -l /var/run/docker.sock
# srw-rw---- 1 root docker 0 ... /var/run/docker.sock
CLI 안 쓰고 dockerd 직접 얘기하기·bash
# The Docker CLI is just a REST client. You can call the API yourself.
curl --unix-socket /var/run/docker.sock http://localhost/v1.43/containers/json

# Returns JSON for every running container —
# the same data 'docker ps' shows.

External links

Exercise

Linux 호스트 (또는 Linux VM) 에서 container 돌아가는 동안 pstree 해. dockerd → containerd → containerd-shim → 앱 체인 찾아. PID 적어. 그 다음 docker stop 으로 container 멈추고 pstree 다시 — 어떤 process 사라지고 어떤 게 남는지.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.