Docker 개념 및 특징

BLAKE KIM·2020년 9월 12일
0

Docker란?

Docker는 가상화 기술이다. 가상화 컨테이너에 application 배포를 자동화 시켜주는 오픈 소스 엔진이다. (container virtualization 기술의 또다른 이름으로 오해하는 경우가 있는데 그렇지 않도록 주의하자.) Docker는 가상화 컨테이너 실행 환경 위에서 application 배포 엔진을 더함으로써 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있는 기술을 제공한다. 이는 요즘 널리 사용되는 MSA(Micro Service Architecture)와 CI/CD와 아주 잘 조화되어서 많은 각광을 받는다고 한다. 실제로 Docker는 한 컨테이너 당 하나의 application이나 프로세스를 실행하는 것을 권장한다. MSA의 철학과 일맥 상통한다.

MSA(Micro Service Architecture)

마이크로 서비스란 소프트웨어를 구축하기 위한 아키텍처이자 하나의 접근 방식으로, 애플리케이션을 상호 독립적인 최소 구성 요소로 분할합니다. 모든 요소를 하나의 어플리케이션에 구축하는 전통적인 모놀리식 접근 방식 대신 마이크로 서비스에서는 모든 요소가 독립적이며 연동되어 동일한 태스크를 완수합니다. 이러한 각각의 구성 요소 또는 프로세스가 마이크로서비스입니다. 소프트웨어 개발에 대한 이러한 접근 방식은 세분화, 경량화 되어 있으며 다수의 애플리케이션 간에 유사한 프로세스를 공유(엔터프라이즈 통합)하는 기능을 중시합니다. 이는 클라우드 네이티브 모델 구현을 위해 애플리케이션 개발을 최적화(클라우드 네이티브 애플리케이션)하는 데 필요한 주요 구성 요소입니다.

여기서 마이크로서비스 기반 인프라를 사용하려는 이유가 무엇인지를 파악해야 합니다. 개발자의 목표는 고품질 소프트웨어를 보다 신속하게 제공하는 것입니다. 마이크로서비스는 이 목표를 실현하기 위한 수단이 되며, 이때 고려해야 할 사항이 있습니다. 바로 애플리케이션을 마이크로서비스로 분할하는 것으로는 충분하지 않다는 사실입니다. 애플리케이션을 관리하고 오케스트레이션하며 여기서 생성되고 수정되는 데이터를 처리해야 합니다.

출처: Red Hat

Hypervisor 가상화 VS Container 가상화

Hypervisor 가상화의 경우 기존 OS에 가상환경에서 또 하나의 OS를 설치하는 것으로 완전한 독립적 OS로 운영되는 것이다. 장점으로는 한 서버에 하나의 OS만 운영을 하는 경우 해당 OS가 서버의 모든 리소스를 항상 full로 사용하기 어려우며 서버 리소스들이 idle 상태로 낭비되어지는 경우가 있을 수 있다. (이 때 idle 상태는 실행되지 않은 상태로 존재하는 경우를 말한다.) 그러나 hypervisor 가상화를 사용하면 idle 상태로 두지 않고 필요한 OS나 서비스에 할당이 되어질 수 있으므로 리소스를 훨씬 효율적으로 사용할 수 있다. 그러므로 고급 사양의 좋은 서버에 여러 가상화 OS를 운영하는 것이 저급이나 중급 사양의 여러 서버를 운영하는 것보다 훨씬 효율적이라는 것이다. 단점으로는 기술적으로 무겁기 때문에 booting 시간이 길어지고 리소스를 많이 차지할 수 밖에 없다.

요약하면 Hypervisor 가상화의 장점은 CPU를 idle 상태로 두지 않기 때문에 효율적이지만 단점으로는 각기 다른 OS를 사용하기에 무겁다.

Docker같은 컨테이너 가상 기술은 OS 커널 위의 유저 공간에서 실행된다. 운영체제를 가상화하는 것이 아닌 유저 공간을 가상화한다고 생각하면 쉽다. 즉 하나의 호스트 서버에 여러 독립적인 유저 공간을 가상적으로 실행할 수 있다. 이러한 컨테이너 가상화는 hypervisor 가상화보다 훨씬 가볍기 때문에 빠르고 쉽게 독립적인 가상 환경을 실행시킬 수 있다. 또한 hypervisor는 baseOS와 가상화 OS 사이에 커널 시스템을 연결해줄 emulation layer가 필요한데 컨테이너 가상화는 일반적인 시스템 API interface를 사용한다. 단점은 독립적인 OS가 아니기 때문에 운영체제가 다른 호스트에서는 실행 시킬 수 없다. 그러나 개발자라면 windows를 대부분 사용하지 않기 때문에 크게 상관없다. 또한 독립적인 운영체제가 아니기 때문에 보안적인 측면에서 hypervisor 가상화보다 약할 수 밖에 없다.

요약하면 컨테이너 가상화의 장점은 훨씬 가볍고 빠르고 쉽게 가상환경을 실행 시킬 수 있고 일반적인 시스템 API interface를 사용한다. 단점은 baseOS와 다른 운영체제에서는 실행시킬 수 없으며 보안적인 측면에서 약하다.

Docker 구조

4가지로 구분되어 있다.

  • Docker client와 server(server는 docker engine으로 불리기도 한다.)
  • Docker image
  • Docker registries
  • Docker containers

Docker client & server

Docker는 클라이언트와 서버 구조로 이루어져 있다. 클라이언트가 서버에 명령을 전달하고 서버가 실행시키는 구조이다. docker binrary 커맨드가 docker 클라이언트이고 dockerd 가 docker daemon 혹은 docker engine이다. Docker engine과 interact하기 위한 Restful API도 제공된다. 클라이언트와 서버는 동일한 호스트 안에서 운영 될수도 있으며 서로 다른 호스트에서 운영 될수도 있다.

Docker image

Docker의 life cycle에서 docker 이미지는 “build”의 부분에 해당된다. Docker container에서 실행시키고 싶은 application을 docker 이미지로 빌드해서 실행시키게 된다.

Docker registries

Docker registires는 docker 이미지를 저장하는 repository라고 보면 된다. Source code를 github에 저장하여 관리하듯 docker 이미지는 dockerhub 같은 docker registries에 저장한다고 생각하면 된다. Github가 마찬가지로 public registry 가 있고 private registry가 있다.

Docker containers

Docker container에서 docker 이미지가 실행된다. 즉 docker 이미지를 실행시키는 가상화 공간 이다. Docker container는 하나 혹은 그 이상의 프로세스를 실행 시킬수 있다. (하지만 하나의 프로세스만 실행시키는 것을 권장한다.)

Docker Compose And Swarm

Docker에서는 여러 docker container들로 이루어진 stack이나 cluster를 관리하는 서비스도 제공하는데 바로 docker compose와 docker swarm이다.

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

Docker swarm은 docker container들로 이루어진 cluster를 관리할 수 있도록 해주는 서비스이다. 즉 docker container를 위한 clustering tool이다.

Docker VS Configuration Management Tools

Docker가 Chef나 Puppet, Ansible같은 CM tool들을 대체하는가에 대해서 물어보시는 분들이 많다. Docker를 사용함으로써 많은 CM부분이 해결되는 것은 맞지만 그래도 여전히 CM의 역할이 남아 있다. 예를 들어 docker를 사용하기 위해서는 docker가 호스트에 설치되어 있어야 한다. 이러한 부분은 CM tool을 사용하여 관리할 수 있다.

profile
BackEnd

1개의 댓글

comment-user-thumbnail
2023년 5월 15일

A really nice post. Awesome and inspiring content you posted.
WyndhamRewards

답글 달기