
많은 개발자들이 아래 명령어는 매일 사용합니다.
docker run nginx
하지만 Enter를 누른 직후 어떤 일이 일어나는지 정확히 설명할 수 있는 사람은 많지 않습니다.
사실 Docker는 혼자 컨테이너를 만드는 것이 아닙니다.
Docker Client, Docker Daemon, containerd, runc, Linux Kernel이 서로 협력하여 하나의 컨테이너를 실행합니다.
이 과정을 이해하는 순간 Docker는 더 이상 ‘마법’이 아니라 Linux 위에 구축된 뛰어난 시스템 아키텍처로 보이기 시작합니다.
Docker 컨테이너는 이렇게 시작됩니다.
① Docker Client (CLI)
사용자가 입력한 명령(docker run)을 Docker Daemon에게 전달합니다.
입력 → 요청 전달
② Docker Daemon (dockerd)
Docker의 핵심 관리자입니다.
컨테이너 생성 여부를 판단하고
이미지 다운로드,
네트워크,
볼륨,
스토리지,
보안 설정 등을 준비합니다.
Docker의 컨트롤 타워
③ containerd
실제 컨테이너의 생명주기를 관리합니다.
* 이미지 관리
* Snapshot 관리
* 컨테이너 생성
* 삭제
* 시작
* 중지
등을 담당합니다.
컨테이너 운영 관리자
④ runc
실제 컨테이너를 생성하는 런타임(Runtime)입니다.
Linux Kernel 기능을 사용하여
격리된 프로세스를 생성합니다.
컨테이너를 실제 실행하는 엔진
⑤ Linux Namespaces
컨테이너를 서로 완전히 분리합니다.
각 컨테이너는
* PID
* Network
* Mount
* IPC
* User
* UTS
등을 독립적으로 사용합니다.
즉,
각 컨테이너는 자신만의 작은 Linux처럼 동작합니다.
⑥ cgroups
CPU와 Memory를 마음대로 사용하는 것을 막습니다.
예를 들어
CPU : 2 Core
Memory : 1GB
처럼 자원을 제한할 수 있습니다.
여러 컨테이너가 동시에 실행되어도 시스템이 안정적인 이유입니다.
⑦ OverlayFS
이미지 레이어를 하나로 합쳐
하나의 파일 시스템처럼 제공합니다.
읽기 전용(Image Layer)
쓰기 가능(Container Layer)
=
실행 중인 컨테이너
덕분에 Docker는 매우 빠르고 저장공간도 효율적으로 사용합니다.
⑧ Container Process Start
모든 준비가 끝나면
마지막으로 지정한 프로그램이 실행됩니다.
예를 들어
docker run nginx
이라면
컨테이너 내부에서는
nginx
프로세스가 PID 1로 실행됩니다.
이 프로세스가 종료되면
컨테이너도 함께 종료됩니다.
Docker 아키텍처 흐름
docker run nginx
│
▼
Docker Client (CLI)
│
▼
Docker Daemon (dockerd)
│
▼
containerd
│
▼
runc
│
▼
Linux Kernel
├─ Namespaces
├─ cgroups
└─ OverlayFS
│
▼
Container Process (nginx)
왜 이 원리를 알아야 할까요?
Docker의 내부 동작 원리를 이해하면 다음과 같은 실무 문제를 훨씬 빠르게 해결할 수 있습니다.
컨테이너가 실행되지 않는 원인 분석
Docker 아키텍처 이해
containerd 및 runc 오류 해결
CPU·메모리 성능 최적화
프로세스 격리(Isolation) 이해
Linux Kernel 기반 컨테이너 구조 이해
Kubernetes 구조를 더 쉽게 학습
DevOps 및 클라우드 엔지니어 역량 향상
핵심 메시지
많은 사람들은 Docker를 명령어(Command) 로만 배웁니다.
하지만 뛰어난 엔지니어는 동작 원리(Architecture) 를 먼저 이해합니다.
Docker는 가벼운 가상머신(VM)이 아닙니다.
Linux Kernel 위에서 실행되는 ‘격리된 프로세스(Process)’ 일 뿐입니다.
이 사실을 이해하는 순간,
문제가 발생해도 추측하지 않습니다.
Docker Client → dockerd → containerd → runc → Linux Kernel → Container Process 순서대로 흐름을 따라가며 원인을 분석할 수 있습니다.
기억하세요!
“명령어를 외우는 개발자는 Docker를 사용합니다.
동작 원리를 이해하는 개발자는 Docker를 설계하고
문제를 해결합니다.”
오늘부터는 docker run을 입력할 때마다 컨테이너가 만들어지는
전체 흐름을 떠올려 보세요.
그것이 Docker를 진정으로 이해하는 첫걸음입니다.
— 이춘곤(Mark) · ISC.studio · ISC출판 도서 안내
이 글은 저자의 Facebook에 처음 게시한 글입니다. Facebook 원문 보기
💬 댓글 (0)