- 프로세스 요약
- Build: 사용자가 클라이언트에서
docker build를 수행하면 🡲 도커 데몬이 이미지를 생성함 - Pull:
docker pull 명령 시 🡲 데몬은 레지스트리에서 이미지를 찾아 🡲 호스트로 가져옴 - Run:
docker run 명령을 내리면 🡲 데몬은 호스트에 저장된 이미지를 사용하여 🡲 컨테이너를 생성하고 실행
1. 사용자 관점
- 사용자 입장에서 도커는
- 코드로 정의된 환경(Dockerfile)을 이미지로 굽고, 이를 컨테이너라는 격리된 상자에 담아 어디서든 똑같이 실행하는 도구
- 사용자는 도커 클라이언트(명령어 창)를 통해 도커 호스트(서버)와 소통하며 모든 작업을 제어
- 개발자나 운영자가 도커를 사용할 때 마주하는 ‘명령어 기반의 워크플로우’를 중심으로 설계되어 있음
- 사용자는 복잡한 시스템 내부 원리를 몰라도 몇 가지 핵심 명령어를 통해 애플리케이션을 빌드하고 실행할 수 있음
- 프로세스는 크게 Build(빌드) 🡲 Ship(배포) 🡲 Run(실행)의 3단계 생명 주기를 따름

- 빌드 및 생성 (Build)
- 사용자가 로컬 환경에서 자신만의 애플리케이션 환경을 정의하고 이미지로 만드는 단계
- Dockerfile 작성: 애플리케이션 실행에 필요한 운영체제, 패키지, 소스 코드 등을 텍스트 파일로 명시
docker build 실행: 작성한 Dockerfile을 기반으로 도커 호스트(데몬)에게 이미지 생성 요청- 결과물: 도커 이미지(Docker Image)가 호스트 내부에 생성되어 저장됨
- 이미지 관리 및 풀 (Pull)
- 이미 생성된 이미지를 가져오거나 보관하는 단계
docker pull: 사용자가 직접 이미지를 만들지 않아도, 도커 레지스트리(Docker Hub 등)에 이미 올라와 있는 공식 이미지(예: Nginx, MySQL, Python)를 로컬 호스트로 다운로드할 수 있음- 결과물: 레지스트리에 있던 이미지가 사용자의 호스트 PC 내부 저장소로 복사됨
- 실행 및 관리 (Run & Manage)
- 이미지를 바탕으로 실제 서비스(컨테이너)를 가동하고 제어하는 단계
docker run- 로컬에 있는 이미지를 인스턴스화하여 컨테이너로 실행함
- 이때 사용자는 포트 포워딩, 환경 변수 설정 등의 옵션을 함께 부여함
- 컨테이너 상태 제어 (Manage)
docker ps: 현재 어떤 컨테이너가 살아 움직이고 있는지 목록 확인docker stop: 실행 중인 컨테이너 프로세스를 안전하게 정지시킴docker rm: 더 이상 필요 없는 컨테이너 삭제
- 배포 (Push)
- 나만의 설정을 마친 이미지를 다른 사람이나 서버와 공유하기 위한 단계
docker push: 로컬에서 검증을 마친 이미지를 도커 레지스트리(Docker Hub 또는 사설 레지스트리)로 업로드- 효과: 다른 사용자나 운영 서버에서
docker pull 한 줄만으로 내가 만든 것과 100% 동일한 환경을 즉시 재현할 수 있음
2. 시스템 관점
- 시스템 관점에서의 도커 작동 프로세스는
- 리눅스 커널 기술(Namespaces, Cgroups)을 활용해 프로세스를 격리하고, 레이어 방식의 파일 시스템을 통해 자원을 효율적으로 관리하는 지능형 프로세스 관리자
- 사용자가 내린 명령이 호스트 OS의 커널 수준에서 어떻게 처리되고, 자원이 어떻게 격리되어 실행되는지 그 내부 메커니즘을 보여줌
- 단순히 앱을 띄우는 것이 아니라, OS 수준에서 자원을 쪼개고 가두어 완벽하게 독립된 가상 실행 환경을 구성하는 것이 그 본질
- 이 프로세스는 크게 빌드(Build) 🡲 실행 및 격리(Runtime & Isolation) 🡲 그리고 인프라 연동(Infrastructure)의 관점으로 나뉨

- 빌드 및 이미지 생성 (Build System)
- 사용자가
docker build를 호출했을 때 시스템 내부에서 일어나는 과정- Dockerfile 파싱 및 이미지 레이어링: 도커 데몬(
dockerd)은 Dockerfile의 각 명령어를 분석하여 계층 구조의 레이어 생성 - 스택 구조의 파일 시스템: 각 레이어는 이전 레이어의 변경 사항만을 저장하는 읽기 전용(Read-only) 상태로 쌓임
- 저장소 전달: 생성된 최종 이미지는 호스트의 로컬 저장소에 저장되거나 레지스트리로 전송(Push)될 준비를 마침
- 컨테이너 실행 및 격리 (Container Runtime)
- 이미지를 실체화하여 독립된 프로세스로 만드는 핵심 단계
- 컨테이너 런타임(runc): 도커 데몬은
runc와 같은 저수준 런타임을 통해 리눅스 커널에 컨테이너 생성 요청 - 네임스페이스(Namespaces)를 통한 격리: 시스템의 자원을 논리적으로 분리
- PID: 컨테이너가 자신만의 프로세스 번호를 갖게 하여 다른 컨테이너의 프로세스를 볼 수 없게 함
- Network: 독립된 네트워크 인터페이스(veth)와 IP 할당
- Mount: 컨테이너마다 독립된 파일 시스템 루트 부여
- Cgroups(Control Groups)를 통한 자원 제한: 특정 컨테이너가 호스트의 CPU, 메모리, 디스크 I/O를 독점하지 못하도록 물리적 자원 사용량을 할당하고 제한함
- 기록 가능 레이어 (Writable Layer)
- 시스템은 읽기 전용 이미지 레이어 위에 ‘컨테이너 레이어’라 불리는 얇은 쓰기 가능 층을 배치
- Copy-on-Write(CoW):
- 이미 존재하는 파일의 수정이 필요할 때만 아래 레이어에서 위로 복사하여 수정
- 이는 컨테이너가 삭제되면 함께 사라짐
- 이 구조 덕분에 수많은 컨테이너가 동일한 원본 이미지를 공유하면서도 각자의 상태를 유지할 수 있음
- 네트워킹 및 스토리지 연동 (System Integration)
- 컨테이너 외부와의 통신 및 데이터 저장을 처리하는 하위 시스템입니다.
- 도커 가상 네트워크: 호스트의 물리 인터페이스(eth0)와 컨테이너의 가상 인터페이스(veth)를 브리지로 연결하여 통신 경로 확보
- 포트 포워딩: 호스트로 들어오는 특정 포트의 트래픽을 네트워크 네임스페이스 내부의 컨테이너 포트로 전달
- 스토리지 드라이버:
overlay2 등과 같은 드라이버가 레이어 구조의 파일 시스템을 실제 디스크에 효율적으로 매핑하고 관리 - 볼륨 및 마운트: 휘발성인 컨테이너 레이어를 벗어나 호스트의 특정 디렉토리나 도커 볼륨에 데이터를 직접 기록하여 영속성 확보
3. 사용자 관점과 시스템 관점의 비교
- 사용자 관점과 시스템 관점의 비교는
- 도커라는 기술을 ‘무엇을 하는가(What)’와 ‘어떻게 돌아가는가(How)’라는 두 가지 측면에서 대조하여 보여줌
- 사용자는 단순한 명령어로 복잡한 인프라를 제어하고, 시스템은 그 이면에서 정교한 격리 기술을 통해 이를 실현함
- 사용자가
docker run이라는 간단한 명령어를 입력할 때,- 시스템 이면에서는 네임스페이스 격리, 자원 할당(cgroups), 레이어 병합, 가상 네트워크 설정이라는 복잡한 메커니즘이 동시에 가동되어 완벽한 가상 환경을 만들어냄

- 상단: 사용자 관점 (단순한 명령어 기반 흐름)
- 사용자에게 도커는 복잡한 인프라 설정 과정을 생략해 주는 ‘추상화된 도구’
- 이미지 가져오기 (docker pull): 필요한 환경이 이미 만들어진 이미지를 레지스트리에서 로컬로 내려받는 과정
- 나만의 이미지 만들기 (docker build):
Dockerfile이라는 레시피를 작성하여 나만의 맞춤형 환경을 구축 - 컨테이너 실행 (docker run):
- 이미지를 실체화하여 애플리케이션을 가동함
- 사용자는 이 단계에서 서비스가 정상 동작하는지 확인함
- 배포 (docker push): 검증된 이미지를 다시 레지스트리에 올려 다른 서버나 팀원과 공유
- 하단: 시스템 관점 (상세한 리소스 관리 및 격리)
- 시스템 내부에서 도커는 호스트 OS의 커널 자원을 효율적으로 나누어 쓰는 ‘지능형 프로세스 관리자’로 동작
- 이미지 분석 및 생성 (Build Engine):
Dockerfile의 각 행을 분석(Parsing)하여 계층화된 이미지 레이어 생성 - 레이어 기반 관리 (Storage Driver):
- 읽기 전용인 이미지 레이어 위에 ‘쓰기 가능 레이어’를 얹어,
- 여러 컨테이너가 원본 이미지를 공유하면서도 각자의 변경 사항을 기록할 수 있게 함
- 실행 및 격리 (Container Runtime):
- Namespaces: 컨테이너가 독립된 네트워크, 프로세스(PID), 파일 시스템을 갖도록 논리적으로 격리
- cgroups: 각 컨테이너가 사용할 수 있는 CPU, 메모리 자원량을 제한하여 시스템 전체의 안정성 보장
- 시스템 연동 (Networking & Storage):
- 네트워크: 호스트 포트와 컨테이너 포트를 연결(Port Forwarding)하여 통신 경로 확보
- 스토리지: 휘발성인 컨테이너 내부 데이터를 영구 보존하기 위해 호스트의 물리 저장소와 연결(Volume)
4. 핵심 차이점 요약
| 구분 | 사용자 관점 (User View) | 시스템 관점 (System View) | | 편의성, 배포 속도, 환경 일관성 | 보안(격리), 자원 효율성, 안정성 |
| 서비스, 앱, 명령어 | 프로세스, 레이어, 커널 자원 |
| 스마트폰 앱 설치 및 실행 | OS의 프로세스 스케줄링 및 자원 할당 |