다양한 구성 요소들로 application stack을 개발하는데 생기는 문제들

  1. 기본 OS와의 호환성 문제
    • 특정 버전의 서비스가 OS와 호환되지 않을 수 있음
  2. 구성요소(web sever, database, messaging, orchestration)와 OS에 필요한 라이브러리 및 의존성 간의 호환성을 확인
    • 구성 요소를 최신 버전으로 업그레이드하거나 데이터베이스를 변경할 때마다 이러한 호환성 문제를 다시 점검해야함.
    • matrix from hell
  3. 새로운 개발자를 추가할 때 마다 새 환경을 설정하는 것이 번거로움
  4. 개발자마다 선호하는 OS가 다르고, app이 모든 OS에서 동일하게 실행되는 것을 보장할 수 없음

위 문제의 해결책으로서 Docker

  1. 각 구성 요소를 자체 의존성 및 라이브러리를 갖춘 별도의 컨테이너에서 실행함
  2. 모두 동일한 VM 및 OS에서, 그러나 별도의 환경 또는 컨테이너 내에서 실행할 수 있음
  3. Docker 설정을 한 번만 구축하면, 모든 개발자는 간단한 Docker run 명령으로 시작할 수 있음
  4. 기본 OS가 무엇이든 간에, Docker만 설치하면 동일하게 실행됨

DOCKER

  • 애플리케이션을 패키징 + 컨테이너화하여 어디서든지 언제든지 원하는 만큼 실행할 수 있도록 하는 것입니다.

what is container

  • 완전히 격리된 환경
  • 자체 (process, service, network, interface, mount)를 가짐
  • 각 container는 동일한 OS kernel을 공유
  • docker의 container
    • LXC container
    • high level의 도구를 제공하여 사용자들이 low level의 container 환경을 설정할 수 있도록 함.

about OS

  • OS = OS kernel + software
  • OS kernel : 하드웨워와 상호작용을 담당
  • softwware : OS에서 차이점을 만드는 부분(사용자 인터페이스, 드라이버, 컴파일러 등)
  • 공통된 Linux kernel이 모든 OS에 공유되어 일부 맞춤형 software가 각 OS를 구분함
    • docker는 동일한 kernel을 기반으로 하는 다른 OS 배포판을 container에서 실행할 수 있음
      • ex) 기본 OS : Ubuntu OS에 Docker가 설치,
      • Docker는 Debian, Fedora, SUSE, CentOS 기반의 container를 실행할 수 있음
      • 이때 container는 OS를 구분하는 software를 가짐
    • 동일한 kernel을 공유하지 않는 OS의 경우?
      • ex) 기본 OS : Windows에 Docker가 설치
      • Windows는 Linux와 동일한 kernel 사용하지 않음
      • Windows에서는 Linux 기반의 container 실행할 수 없음
      • Windows에서 Linux 가상머신을 활용하면 linux container를 사용할 수 있음

Docker vs VM

  1. Docker
    • hardware infra -> OS -> Docker
    • Docker
      • container 관리
      • library와 depandency 지님
      • 크기 작음, 디스크 공간 소비 작음, 부팅속도 빠름
    • 완벽한 격리 아님. container 간에 kernel과 같은 많은 리소스를 공유하기 때문
  2. VM
    • hardware infra -> hiperviser -> VM
    • VM
      • 자체 OS 위에 library와 depandency, application 지님
      • overhead
      • 크기 큼, 디스크 공간 소비 큼, 부팅 속도 느림
    • 완벽한 격리성(OS나 kernel에 의존하지 않기 때문)

Image | Container

  • Image : pakage or template, 1개 이상의 container 생성하는데 사용됨
  • Container : image를 기반으로 실행 중인 instance, 격리되어 자체 환경과 프로세스를 가짐