Docker

Docker는 container 형태의 애플리케이션을 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다.

Container

container는 application과 그 실행에 필요한 모든 것(code, runtime, library, 설정 등)을 하나의 독립된 패키지로 묶은 것입니다.
쉽게 말하면, container는 “이 앱은 어디서든 똑같이 실행된다”를 보장하는 기술입니다.

VM vs Container

VM은 각 application마다 완전한 Guest OS가 필요하지만, container는 Host OS의 kernel을 공유하기 때문에 훨씬 가볍습니다.

Container 사용 이유

  1. 환경 일관성
    • 동일한 환경에서 개발/테스트/운영 되므로 Library 버전이나 OS 차이로 발생하는 문제가 없음.
  2. 자원 효율
    • Guest OS 없이 Host OS의 Kernel을 공유하기 때문에 같은 서버에서 VM보다 훨씬 많은 application을 동시에 실행할 수 있음.
  3. 프로세스 격리
    • Python2를 사용하는 application과 Python3를 사용하는 application을 충돌 없이 같은 서버에서 실행할 수 있음.
  4. 빠른 배포
    • VM에 비해 시작 시간이 월등히 빠름 (few seconds…)
    • 따라서 traffic이 급증하면 container를 즉시 복제해 수평 확장할 수 있음.
  5. 이식성
    • Docker Image만 있다면 local, AWS, GCP, Azure 어디서든 동일하게 실행.
    • Cloud 이전이 훨씬 쉬워짐.
  6. 수평 확장
    • traffic에 따라 container 수를 자동으로 늘리고 줄이는 auto-scaling이 가능.

Docker Architecture

  • Docker는 Client-Server architecture를 사용하고 있으며, Client와 Server가 REST API를 통해 통신합니다.
  • Docker Client
    • Docker CLI
      • “docker” Command를 의미하며, Docker daemon에 command를 전송합니다.
      • 기본적으로 Docker Client와 Docker Host는 동일 Host에서 실행되어 Unix Socket으로 communication하지만, Docker Client를 원격 Docker Host에 TCP/IP로 연결 할 수도 있습니다.
  • Docker Host
    • Docker Daemon (dockerd)
      • Host Machine에서 Background로 실행되는 핵심 서버 프로세스입니다.
      • Client의 요청을 받아 아래 자원들을 관리합니다.
        • Images
        • Containers
        • Volumes
        • Networks
    • Images
      • Docker에 포함된 Local image repository입니다.
    • Containers
  • Registry
    • Docker Hub와 같은 Public Repository 혹은 별도의 Private Repository가 될 수 있음.