Docker란?

Posted by youmin park on 2021-02-06

Docker란?

Docker?

도커는 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트이다.

기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이였다. 이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고, 각 가상 머신에는 우분투(Ubuntu), CentOS등의 운영체제가 설치되서 사용된다. 하이퍼바이저에 의해 생성되고 관리되는 운영체제를 게스트 운영체제 라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용한다.

이러한 가상화 방식의 대표적인 툴로는 Virtual Box, VMware 등이 있습니다.

KakaoTalk_Photo_2021-02-06-14-27-34

가상머신은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능이 떨어지고, 가상머신은 게스트 운영체제 사용을 위한 라이브러리, 커널등을 전부 포함하기 때문에 배포를 위한 이미지를 만들었을때 이미지의 크기가 크다는 단점이 있다.

즉, 완벽한 운영체제를 생성할 수 있다는 장점이 있지만, 일반 호스트에 비해 손실이 있을 수 있으며, 수 기가 바이트에 달하는 이미지를 애플리케이션으로 배포하기에는 부담스럽다.

그에 반해, 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스(namespace),cgroup 을 사용하므로써 프로세스 단위의 격리환경을 만들기 때문에 성능 손실이 거의 없다. 컨테이너에 필요한 커널은 호스트의 커널을 공유해서 사용하며, 컨테이너 안에는 라이브러리와 실행파일만 존재한다.

즉, 있다 컨테이너를 이미지로 만들었을때 이미지의 용량이 가상 머신에 비해 대폭 줄어들고, 가상머신에 비해 빠르며, 성능 손실이 거의 없다.

더 많은 장점들을 적어보자면,

  • 애플리케이션의 개발과 배포가 편해짐

    도커 컨테이너는 호스트 OS위에서 실행되는 격리된 공간이다. 따라서 컨테이너 자체에 특별한 권한을 주지 않는 한, 컨테이너 내부에서 수많은 소프트웨어를 설치하고 설정 파일을 수정해도 호스트 OS에는 영향을 끼치지 않는다. 즉, 나만의 독립된 개발 환경을 보장받을 수 있다는 것이다.

    또한 배포를 할려고 할때는 그 컨테이너를 도커 이미지라고 하ㄴ 일종의 패키지로 만들어 운영 서버에 전달하기만 하면 된다. 컨테이너에서 사용되던 운영 서버에 패키지를 설치할 필요도 없으며, 각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요도 없다. 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있기 때문에 개발/운영 환경에서의 통합이 가능해지기 때문이다.

  • 여러 애플리케이션의 독립성과 확장성이 높아짐

    소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식을 모놀리스(Monolith) 애플리케이션이라고 한다. 소규모 서비스에서는 이 방식이 어울릴지도 모르지만, 서비스의 기능이 복잡해지고 거대해질수록 소프트웨어 자체의 확장성과 유연성이 줄어든다는 단점이 있다. 이를 해결하기 위해 떠오른 개념이 바로 마이크로 서비스이다.

    예를 들어 웹 서비스는 데이터베이스 컨테이너와 웹 서버 컨테이너로 분리할 수 있고, 웹 서비스에 부하가 발생할 시 마이크로서비스 구조의 웹 서버 컨테이너만을 동적으로 늘려서 부하를 분산할 수 있다. 또한 이미지를 독립적으로 관리하기 때문에 유지 보수도 용이해진다. 이와 같은 컨테이너 기반의 마이크로서비스는 개발자가 그 구조를 직접 구현하기 보다는 도커 스웜 모드, 쿠버네티스 등의 컨테이너 오케스트레이션 플랫폼을 통해 사용하는 것이 일반적이다.