docker CLI → dockerd (데몬) → containerd → runc → 컨테이너 프로세스
dockerd 는 이미지 · 네트워크 · 볼륨을 관리하고, 실제 컨테이너 생성은 containerd 와 OCI 런타임인 runc 가 맡는다. 컨테이너는 가상 머신이 아니라 호스트 커널을 공유하는 프로세스이며, 격리는 네임스페이스(PID · NET · MNT · UTS · IPC · USER)와 cgroup(자원 제한)으로 이루어진다.
data-root(기본 /var/lib/docker) 아래 구조는 다음과 같다.
| 경로 | 역할 |
|---|---|
overlay2/ |
이미지 레이어와 컨테이너 쓰기 레이어. 보통 용량의 대부분 |
image/overlay2/ |
이미지 메타데이터와 레이어 매핑 |
containers/<id>/ |
컨테이너 설정과 로그(<id>-json.log) |
volumes/ |
이름 있는 볼륨의 실제 데이터 |
network/ |
네트워크 설정 |
buildkit/ |
빌드 캐시 |
설정 파일은 /etc/docker/daemon.json 이다. 용량 문제로 경로를 옮길 때는 data-root 를 바꾸고 데몬을 재시작한다.
{ "data-root": "/data/docker" }
이미지는 읽기 전용 레이어의 겹침이고, 컨테이너는 그 위에 쓰기 레이어 하나를 올린 것이다.
merged/ ← 컨테이너가 보는 최종 파일시스템
upper/ ← 쓰기 레이어 (컨테이너가 만든 · 바꾼 파일)
lower/ ← 이미지 레이어들 (읽기 전용, 여러 장)
work/ ← overlay 내부 작업용
같은 경로의 파일이 여러 레이어에 있으면 위쪽이 이긴다. 컨테이너에서 하위 레이어의 파일을 수정하면 그 파일 전체가 upper 로 복사된 뒤 바뀐다(copy-up). 큰 파일을 컨테이너 안에서 고치면 그만큼 디스크를 더 쓰는 이유다. 삭제는 실제로 지우지 않고 whiteout 파일을 만들어 가린다.
컨테이너를 지우면 upper 레이어가 사라지므로, 남겨야 할 데이터는 볼륨이나 바인드 마운트로 뺀다.
docker run 의 주요 옵션(-d · -p · -v · -e · --name)docker ps -a · logs · exec -it · inspect 로 상태 확인FROM · RUN · COPY · CMD · ENTRYPOINT 차이와 레이어 캐시docker system df 와 docker system prune 으로 용량 관리