Docker

[도커 알아가기] 2. 도커와 Docker engine

begong 2025. 1. 16. 02:58
반응형

관련 글 목록

1. 컨테이너 기술

2. 도커와 Docker engine

3. 도커 네트워크

4. 도커 포트포워딩 시 서버 폭파 문제해결

 

1편에서 컨테이너 기술의 역사와 동작원리에 대해 알아보았습니다.

이어서 도커에 대해서 알아보겠습니다.

도커란?

  • 컨테이너화 기술을 기반으로 하는 오픈 소스 플랫폼
  • 애플리케이션 개발, 배포, 실행의 모든 과정을 자동화하고 간소화하는 데 도움을 줌

도커의 발전과정

  • 초기엔 LXC를 기반으로 개발되었음
    • docker초기에는 lxc를 사용하여 컨테이너를 실행
  • Docker의 컨셉과 어울리지 않고(LXC의 복잡함, 과도한 기능),의존성 문제 떄문에 Libcontainer를 개발
    • LXC : 각 컨테이너가 독립적인 리눅스 시스템처럼 동작할 수 있게 함
    • ⇒ docker는 애플리케이션만 독립되면 됨.
    • Libcontainer
      • 광범위한 격리 기술을 만들고, 리눅스 커널에 있는 namespace, cgroup을 사용하여 컨테이너를 만들고 컨테이너의 수명주기를 제어하기 위해 개발
  • 1.11.0 버전까지는 모놀리식으로, 모든 작업이 Docker Engine에서 실행되었음
  • 현재는 여러 부분으로 모듈화 되어 작업이 여러부분에서 이루어짐

Docker의 아키텍쳐

  • client - server아키텍처
  • Docker client는 Docker Daemon과 통신
  • Docker client
    • 사용자가 Docker와 상호작용 할 수 있게 함
    • 사용자가 명령을 내리면 dockerd로 명령을 보냄
  • Docker Daemon
    • API요청을 수신하여 이미지, 네트워크, 컨테이너, 볼륨과 같은 Docker 객체를 관리

Docker 객체

  • 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체로 이루어짐

도커 실행의 주요 구성요소

  • Docker 엔진
    • Docker Daemon(dockerd), API, Docker CLI로 구성
    • 💡Docker Runtime (runC, containerd 등)을 하위집합에 넣기도 함 (공식문서에는 위에 3개만 엔진의 요소로 들어가 있음)
    • Dockerd
      • Docker API 요청을 수신
      • 역할
        • 이미지 관리, 이미지 빌드, REST API, 인증, 보안, 코어 네트워킹, 오케스트레이션
    • Docker CLI
      • 명령어를 dockerd 에게 REST API형태로 전달
  • containerd
    • 컨테이너의 수명주기 관리, 이미지 push/pull, 스토리지 제어, 네트워크 관리, 네임스페이스 관리
    • OCI런타임과 runC를 제어
    • 컨테이너를 실행(생성)하기 위해 runC를 사용
    • 이미지 관리 및 고급 API와 같은 다른 최상위 기능도 제공
    • 💡
    • runC와 containerd-shim이 containerd의 하위에 들어간다고 볼 수 있음
  • runC
    • OCI 형식에 따라 저수준에서 실행되는 애플리케이션을 패키징(생성)하는 런타임
    • Libcontainer를 발전시켜 runC가 탄생 (Libcontainer는 runC에 포함됨)
  • containerd-shim
    • 컨테이너 프로세스가 runC의 하위프로세스로 시작되는데, runC는 컨테이너가 생성한 뒤 종료됨.
    • shim이 새로운 상위 프로세스가 되어 컨테이너의 생명주기를 관리함.
    • containerd가 컨테이너의 file descriptor와 종료상태를 관리하는 최소한의 코드만 메모리에 남김
    • shim의 주요 역할
      • Daemon이 재시작될 때, 파이프가 닫히는 등의 이유떄문에 container가 종료되지 않도록 stdin, stdout스트림을 열린 상태로 유지
      • Docker나 containerd가 작동하지 않더라도 stdin, stdout, stderr와 같은 파일정보를 보관
      • daemon에게 container의 종료 상태 보고

출처:  https://medium.com/faun/the-missing-introduction-to-containerization-de1fbb73efc5
출처:  https://medium.com/faun/the-missing-introduction-to-containerization-de1fbb73efc5

출처: https://medium.com/faun/the-missing-introduction-to-containerization-de1fbb73efc

도커의 실행 흐름

  1. 사용자가 Docker CLI를 통하여 명령어 실행
  2. Docker client는 적절한 API로 변환하여 Docker Daemon에게 전달
  3. Docker Daemon이 containered와 상호작용하며 컨테이너 실행과 관련된 작업을 함
  4. containerd
    1. 실제 컨테이너를 관리, 실행, 도커가 요청한 작업을 처리
    2. 이미지 풀링, 컨테이너 실행 및 중지 등 수행
    3. runC 를 사용하여 프로세스를 생성하고 격리
  5. runC
    1. 실제 컨테이너의 프로세스 격리 및 실행을 담당
      1. 네임스페이스와 cgroups를 활용하여 컨테이너를 격리하고 실행
      2. 컨테이너를 생성한 뒤 종료됨
        출처 : https://gngsn.tistory.com
  6. containered-shim
    1. runC가 실행한 컨테이너 프로세스를 추적, 컨테이너의 실행 상태를 관리.
    2. 컨테이너가 종료되면 종료된 컨테이너의 상태를 containerd에 보고

출처 : https://gngsn.tistory.com

출처 및 참고문서

Introducing runC: a lightweight universal container runtime | Docker

What is Docker?

Difference between Docker Desktop and Docker Engine

Something Missed? : History of Container Technology

Docker components explained

Architecture of Docker - GeeksforGeeks

# [Docker] Docker Engine

Docker Engine, 제대로 이해하기 (1)

반응형