[Docker] Docker란 무엇인가?

김가람휘·2022년 3월 24일
0

Docker

목록 보기
2/2

1. Docker

  • 도커(Docker)는 가상화 기술이다.

  • Docker라는 회사가 container virtualization을 개발하였고 그래서 docker가 container virtualization 기술의 또 다른 이름으로 오해하시는 분들이 있는데 container virtualization은 docker 이전에 이미 개발되어 존재하고 있었습니다.

  • Docker는 가상화 컨테이너에 application 배포를 자동화 시켜주는 오픈소스 엔진이다.

  • Docker는 container 가상화 실행 환경 위에 application 배포 엔진을 더함으로서 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있는 기술을 제공한다.

  • 이는 요즘 널리 사용되는 MSA(Micro Service Architecture)와 CI/CD와 아주 잘 조화되어서 많은 각광을 받게 된다.

  • 실제로 docker는 한 컨테이너 당 하나의 application이나 프로세스를 실행하는 것을 권한다.
    -> MSA의 철학과 일맥상통 하는것이다.

  • MSA(MicroService Architecture) : 마이크로서비스 아키텍처에 대한 정확한 정의는 없다. 하지만 마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다.
    -> 마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점을 둔다.
  • CI/CD(지속적 통합/지속적 제공) : 애플리케이션 개발 단계를 자동화하여 애플리케이션을 보다 짧은 주기로 고객에게 제공하는 방법입니다.
    -> CI/CD는 애플리케이션의 통합 및 테스트 단계에서부터 제공 및 배포에 이르는 애플리케이션의 라이프사이클 전체에 걸쳐 지속적인 자동화와 지속적인 모니터링을 제공합니다.

2. Hypervisor 가상화 VS Container 가상화

2-1. Hypervisor 가상화

  • Hypervisor는 물리적인 서버에서 하나 혹은 그 이상의 독립적인 운영체제가 돌아가는 구조이다.
    -> 즉, 물리적 서버의 OS위에 여러 다른 독립적인 OS가 가상적(virtually)으로 돌아가는 구조이다.

  • 각각의 OS는 서로에 대해서 알지 못하며 base OS(물리적 서버의 OS)도 알지 못한다.

  • 하나의 물리적 서버에서 실행되고 있지만 가상적으로서 완전한 독립적 OS로 운영되는 것이다.

  • 이러한 가상화의 장점은 물리적 서버의 리소스를 더 효율적으로 사용할 수 있다는 것에 있다.

  • 한 서버에 하나의 OS만 운영을 하는 경우 해당 OS가 서버의 모든 리소스를 항상 full로 사용하기 어려우므로 서버 리소스들이(CPU 등) idle(어떠한 프로그램에 의해서도 사용되지 않는 상태) 상태로 낭비되어 지는 경우가 있을 수 있다.

  • 따라서 hypervisor 가상화를 사용하여 하나의 서버에 여러 OS를 실행시키면 CPU를 idle 상태로 두지 않고 필요한 OS나 서비스에 할당이 되어질 수 있으므로 리소스를 훨씬 효율적으로 쓰게 되는 것이다.

  • 그러므로 고급 사양의 좋은 서버에 여러 가상화 OS들을 운영하는 것이 저급이나 중급 사양의 여러 서버를 운영하는 것보다 훨씬 효율적이라는 것이다.

  • 단점은 기술적으로 너무 무겁다(heavy-weight)는 것이다.
    -> 독립적인 OS를 실행시키는 것이기 때문에 booting 시간이 길 수 밖에 없으며 리소스를 많이 차지할 수 밖에 없다.


2-2. Container 가상화

  • Docker같은 컨테이너 가상화 기술은 hypervisor 가상화와 틀리게 OS의 커널 위의 유저 공간(user space)에서 실행된다.
    -> 즉, 완전히 독립적인 운영체제를 가상화하는 것이 아니라 독립적인 user space를 가상화한다고 생각하면 쉽다.
    -> 즉, 하나의 호스트 서버에서 여러 독립적인 user space 인스턴스들을 가상적으로 실행할 수 있게 되는 것이다.

  • 이러한 가상화 기술의 장점은 hypervisor 가상화보다 훨씬 가볍기 때문에 빠르고 쉽게 독립적인 가상 환경을 실행시킬 수 있다.
    -> 또한 hypervisor는 base OS와 가상화 OS 사이에 커널 시스템 호출을 연결 시켜주는 emulation layer가 필요한데 dockerhypervisor처럼 emulator가 필요없이 그냥 일반적인 시스템 API interface를 사용한다.

  • 예를 들어 docker image만 있으면 어디서든 쉽고 빠르게 test환경, sandbox 환경 및 production 배포를 할 수 있다.
    -> MSACI/CD에 아주 잘 어울리는 가상화 기술로서 각광을 받고 있다.

  • 단점은 독립적인 OS가 아닌 user space 가상화를 하는 형태이다 보니 운영체제가 전혀 틀린 호스트에서는 실행을 시킬 수가 없다.
    -> Windows를 linux 호스트에서 실행시킬 수 없다.

  • 완전히 독립적인 운영체제 가상화가 아니다 보니 보안적인 측면에서 hypervisor보다 약할 수 밖에 없다.


3. Docker 구조

  • Docker는 크게 4가지 부분으로 되어 있다.
    • Docker client, server(docker engine)
    • Docker image
    • Docker registries
    • Docker containers

3-1. Docker client와 server

  • Docker는 클라이언트와 서버 구조로 이루어져 있다.

  • 클라이언트가 서버에 명령을 전달하고 서버가 실행시키는 구조이다.

  • docker binary 커맨드가 docker 클라이언트이고 dockerddocker daemon 혹은 docker engine이다.

  • docker engine과 interact하기 위한 Restful API도 제공된다.

  • 클라이언트와 서버는 동일한 호스트 안에서 운영될 수도 있으며 서로 다른 호스트에서 운영될 수도 있다.


3-2. Docker image

  • Docker의 life cycle에서 docker imagebuild의 부분에 해당된다.

  • Docker container에서 실행시키고 싶은 application을 docker image로 빌드해서 실행시키게 된다.


3-3. Docker registries

  • Docker registries는 docker 이미지를 저장하는 repository라고 보면 된다.

  • Source code를 github에 저장하여 관리하듯 docker image는 dockerhub같은 docker registries에 저장한다고 생각하면 된다.
    -> Github가 마찬가지로 public registry가 있고 private registry가 있다.


3-4. Docker containers

  • Docker container에서 docker image가 실행된다.
    -> 즉, docker image를 실행시키는 가상화 공간이다.

  • docker container는 하나 혹은 그 이상의 프로세스를 실행시킬 수 있다.
    -> 하나의 프로세스만 실행시키는 것을 권장한다.


3-5. Docker Compose And Swarm

  • Docker에서는 여러 docker container들로 이루어진 stack이나 cluster를 관리하는 서비스도 제공한다.
    -> docker compose, docker swarm

  • Docker compose는 복수의 docker container들을 모아서 종합적인 application stack을 정의하고 운영할 수 있도록 해주는 서비스이다.
    -> Compose파일을 사용하여 전체적인 application 서비스를 설정한 후, application을 이루고 있는 각각의 컨테이너들(예를 들어, web 서버 컨테이너, api 서버 컨테이너 등등)을 따로 실행시킬 필요 없이 한번에 생성하고 실행할 수 있도록 해준다.

  • Docker swarmdocker containers들로 이루어진 cluster를 관리할 수 있도록 해주는 서비스이다.
    -> 즉, docker container를 위한 clustering tool이다.

cluster : 컴퓨터 클러스터는 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합을 말한다.


4. Docker VS Configuration Management Tools

  • Docker가 Chef나 Puppet, Ansible 같은 CM tool들을 대체하는가에 대해서 물어보시는 분들이 많다.

  • Docker를 사용함으로서 많은 CM(configuration management)부분이 해결되는 것은 맞지만 그래도 여전히 CM의 역할이 남아있다.
    -> 예를 들어, docker를 사용하기 위해서는 docker가 호스트에 설치되어 있어야 한다. 이러한 부분은 CM tool을 사용하여 관리할 수 있다.

Configuration Management Tools

  • IT Automation의 기본 도구이다. (자동화된 형상 관리 툴)
  • 대규모 heterogeneous computer cluster의 관리
    -> 수천~수만대 이상의 서버를 관리하기 위해
  • HW의 모니터링 및 SW의 설치
  • 환경 불일치 문제 해결
  • Roll Back의 자동화

5. 그 외 Docker의 특징들

  • Docker는 modern한 리눅스 커널이 설치되어 있는 x64호스트에서는 다 실행 가능하다 하지만 커널 버젼 3.10 이상에서 실행되는 것이 overhead가 적기 때문에 권장된다.

  • 최근에는 docker를 Windows나 Mac에서도 사용 가능하다.
    -> 하지만 Windows 및 Mac에서 docker를 직접 실행시키면 내부적으로 가상머신이 실행되어 그 안에서 docker가 실행되기 때문에 개발용 및 테스트 용으로는 괜찮지만 production용도로는 적합하지 않다.

  • docker container는 독립된 root파일 시스템이기도 하다. 그러므로 파일 시스템 분리가 이루어져 있다.

  • 또한 docker container는 호스트와 분리된 프로세스 환경을 가지고 있으므로 독립적인 프로세스를 실행할 수 있다.
    -> 파일 시스템과 프로세스 환경과 마찬가지로 네트워크 또한 분리 되어 있어서 독립적인 가상 네트워크 인터페이스와 IP주소를 가질 수 있다.

  • Resource isolation and grouping : 커널의 cgroups기능을 통해서 docker container마다 독립적인 CPU와 메모리가 할당 될 수 있다.

  • docker 파일 시스템은 copy-on-write을 사용해서 효율적이며 빠른 디스크 IO를 실행한다.
    -> copy-on-write : Linux(Unix)에서는 자식 프로세스를 생성하면 같은 메모리 공간을 공유하게 된다. 그런데 부모 프로세스가 데이터를 새로 넣거나, 수정하거나, 지우게 되면 같은 메모리 공간을 공유할 수 없게 된다.
    -> 이때, 부모 프로세스는 해당 페이지를 복사한 다음 수정한다.

  • docker container에서 STDOUT, STDERR, STDIN을 통해서 생성되는 로그들은 전부 수집되어서 분석하거나 trouble-shooting(문제 해결의 일종)을 가능하게 해준다.
    -> 실행되고 있는 docker container의 shell에 접속해서 interact할 수도 있다.

0개의 댓글