도커의 작동 프로세스

  • 프로세스 요약
    1. Build: 사용자가 클라이언트에서 docker build를 수행하면 🡲 도커 데몬이 이미지를 생성함
    2. Pull: docker pull 명령 시 🡲 데몬은 레지스트리에서 이미지를 찾아 🡲 호스트로 가져옴
    3. Run: docker run 명령을 내리면 🡲 데몬은 호스트에 저장된 이미지를 사용하여 🡲 컨테이너를 생성하고 실행

1. 사용자 관점

  • 사용자 입장에서 도커는
    • 코드로 정의된 환경(Dockerfile)을 이미지로 굽고, 이를 컨테이너라는 격리된 상자에 담아 어디서든 똑같이 실행하는 도구
      • 사용자는 도커 클라이언트(명령어 창)를 통해 도커 호스트(서버)와 소통하며 모든 작업을 제어
    • 개발자나 운영자가 도커를 사용할 때 마주하는 ‘명령어 기반의 워크플로우’를 중심으로 설계되어 있음
    • 사용자는 복잡한 시스템 내부 원리를 몰라도 몇 가지 핵심 명령어를 통해 애플리케이션을 빌드하고 실행할 수 있음

  • 프로세스는 크게 Build(빌드) 🡲 Ship(배포) 🡲 Run(실행)의 3단계 생명 주기를 따름
  1. 빌드 및 생성 (Build)
    • 사용자가 로컬 환경에서 자신만의 애플리케이션 환경을 정의하고 이미지로 만드는 단계
      • Dockerfile 작성: 애플리케이션 실행에 필요한 운영체제, 패키지, 소스 코드 등을 텍스트 파일로 명시
      • docker build 실행: 작성한 Dockerfile을 기반으로 도커 호스트(데몬)에게 이미지 생성 요청
      • 결과물: 도커 이미지(Docker Image)가 호스트 내부에 생성되어 저장됨
  2. 이미지 관리 및 풀 (Pull)
    • 이미 생성된 이미지를 가져오거나 보관하는 단계
      • docker pull: 사용자가 직접 이미지를 만들지 않아도, 도커 레지스트리(Docker Hub 등)에 이미 올라와 있는 공식 이미지(예: Nginx, MySQL, Python)를 로컬 호스트로 다운로드할 수 있음
      • 결과물: 레지스트리에 있던 이미지가 사용자의 호스트 PC 내부 저장소로 복사됨
  3. 실행 및 관리 (Run & Manage)
    • 이미지를 바탕으로 실제 서비스(컨테이너)를 가동하고 제어하는 단계
      • docker run
        • 로컬에 있는 이미지를 인스턴스화하여 컨테이너로 실행함
        • 이때 사용자는 포트 포워딩, 환경 변수 설정 등의 옵션을 함께 부여함
      • 컨테이너 상태 제어 (Manage)
        • docker ps: 현재 어떤 컨테이너가 살아 움직이고 있는지 목록 확인
        • docker stop: 실행 중인 컨테이너 프로세스를 안전하게 정지시킴
        • docker rm: 더 이상 필요 없는 컨테이너 삭제
  4. 배포 (Push)
    • 나만의 설정을 마친 이미지를 다른 사람이나 서버와 공유하기 위한 단계
      • docker push: 로컬에서 검증을 마친 이미지를 도커 레지스트리(Docker Hub 또는 사설 레지스트리)로 업로드
      • 효과: 다른 사용자나 운영 서버에서 docker pull 한 줄만으로 내가 만든 것과 100% 동일한 환경을 즉시 재현할 수 있음

2. 시스템 관점

  • 시스템 관점에서의 도커 작동 프로세스는
    • 리눅스 커널 기술(Namespaces, Cgroups)을 활용해 프로세스를 격리하고, 레이어 방식의 파일 시스템을 통해 자원을 효율적으로 관리하는 지능형 프로세스 관리자
    • 사용자가 내린 명령이 호스트 OS의 커널 수준에서 어떻게 처리되고, 자원이 어떻게 격리되어 실행되는지 그 내부 메커니즘을 보여줌

    • 단순히 앱을 띄우는 것이 아니라, OS 수준에서 자원을 쪼개고 가두어 완벽하게 독립된 가상 실행 환경을 구성하는 것이 그 본질
  • 이 프로세스는 크게 빌드(Build) 🡲 실행 및 격리(Runtime & Isolation) 🡲 그리고 인프라 연동(Infrastructure)의 관점으로 나뉨

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

3. 사용자 관점과 시스템 관점의 비교

  • 사용자 관점과 시스템 관점의 비교는
    • 도커라는 기술을 ‘무엇을 하는가(What)’와 ‘어떻게 돌아가는가(How)’라는 두 가지 측면에서 대조하여 보여줌
  • 사용자는 단순한 명령어로 복잡한 인프라를 제어하고, 시스템은 그 이면에서 정교한 격리 기술을 통해 이를 실현함
  • 사용자가 docker run이라는 간단한 명령어를 입력할 때,
    • 시스템 이면에서는 네임스페이스 격리, 자원 할당(cgroups), 레이어 병합, 가상 네트워크 설정이라는 복잡한 메커니즘이 동시에 가동되어 완벽한 가상 환경을 만들어냄

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

4. 핵심 차이점 요약

구분사용자 관점 (User View)시스템 관점 (System View)
주요 관심사편의성, 배포 속도, 환경 일관성보안(격리), 자원 효율성, 안정성
인식 단위서비스, 앱, 명령어프로세스, 레이어, 커널 자원
비유스마트폰 앱 설치 및 실행OS의 프로세스 스케줄링 및 자원 할당

© 2020. AiDALab Co. All rights reserved.

Powered by Hydejack v9.2.1