1. Docker란?

Docker의 핵심은 경량화 가상화 컨테이너다.
Docker를 활용하여 OS 및 개발, 테스트, 실행 환경을 모두 포함하여 하나의 컨테이너 형태로 배포 가능하다.

도커 엔진

docker-engine.png
우리가 흔히 말하는 도커는 일반적으로 도커 엔진을 의미한다.

도커를 실행하면 dockerd라는 데몬 프로그램이 서버로서 실행되며 REST API, CLI(docker) 도구들이 클라이언트가 되어서 도커 데몬에게 작업을 지시한다.

컨테이너란?

도커 컨테이너는 도커 이미지의 실행가능한 인스턴스를 뜻한다.

도커는 LXC(Linux Container)를 기반으로 chroot, namespace, cgroup을 사용하여 OS를 마치 프로세스 단위로 사용한다.

이러한 방법으로 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.

컨테이너는 이미지를 읽기전용으로 사용하고 변경사항은 컨테이너 계층에 저장하므로 컨테이너에서의 변경은 이미지에 영향을 주지 않는다.


컨테이너와 VM의 차이

container-vs-vm

기존의 가상화 기술(VM)은 하이퍼바이저를 이용하여 Guest OS를 설치하고 그 위에 어플리케이션을 올리는 구조였다.

또한 호스트의 커널을 공유해 사용하기 때문에 컨테이너 안에는 애플리케이션에 필요한 라이브러리 및 실행파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 용량 또한 가상머신에 비해 적다.

Ubuntu를 예로 들자면!

Ubuntu에서 Redhat 컨테이너를 만든다고 가정해보자.
둘 다 Linux 기반이기 때문에 공통 부분이 있을 것이다.
공통 부분을 커널에서 공유하고, Redhat에서만 사용하는 부분만 bin/libs에 다운받아 사용한다.

Docker는 위와 같은 방식으로 커널을 공유함으로써 마치 하나의 운영체제에서 어플리케이션과 같은 형태로 가상화된 OS가 돌아갈수 있게 된다.

TIP

WindowsMac은 리눅스 기반이 아니기에 도커가 알아서 가상머신을 설치하고 그 위에 리눅스를 설치해준다.
그래서 속도 저하가 없진 않지만, 그럼에도 도커는 가상머신의 QEMU 계층이 없어서 더 빠르다.


도커 아키텍처

container-vs-vm

도커 데몬

도커 데몬(dockerd)은 도커 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 도커 객체를 관리한다.
도커 서비스 관리를 위해 다른 데몬과 통신할 수도 있다.

도커 클라이언트

도커 클라리언트(docker)는 docker run과 같은 명령을 전송하여 dockerd를 수행한다.
이 docker 명령은 도커 API를 사용한다. 도커 클라이언트는 둘 이상의 데몬과 통신할 수 있다.

도커 레지스트리

도커 레지스트리는 도커 이미지를 저장한다.
도커 허브가 대표적인 공용 레지스트리이며, 도커에서 이미지를 다운받을 때 기본적으로 도커 허브에서 이미지를 찾도록 구성되어 있다.


이미지

Docker에서 이미지란 컨테이너를 구동시키기 위한 필요한 파일과 설정값 등을 저장한 것이다.

이미지는 변하지 않고(Immutable) 상태를 가지지 않는다.(Stateless)

# 일반 이미지
{REPOSITORY_NAME}/{IMAGE_NAME}:{IMAGE_TAG}
ex) jenkins/jenkins:lts

# 도커 허브 공식 이미지
{IMAGE_NAME}:{IMAGE_TAG}
ex) openjdk:8-alpine

도커의 장점

1. 개발과 배포가 편해진다.

도커 컨테이너는 호스트 OS 위에서 실행되는 격리된 공간이다.

격리된 공간이기에 컨테이너 내부에서 무엇을 설치하든 호스트 OS에는 영향을 끼치지 않는다.

즉, 독립된 개발 환경을 보장받는다.

작업을 마치고 배포하고 싶다면 해당 컨테이너를 도커 이미지라고 하는 일종의 패키지로 만들어 서버에 전달하기만 하면 된다.

2. 여러 애플리케이션의 독립성과 확장성이 높아진다.

모놀리스 vs 마이크로서비스

모놀리스 : 소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식
마이크로서비스 : 여러 모듈을 독립된 형태로 구성하는 방식

monolith-microservice

모놀리스 방식은 서비스가 거대해질수록 확장성과 유연성이 줄어드는 단점이 있다.

그에 비해 마이크로서비스 구조는 여러 모듈을 독립된 형태로 구성하기 때문에

  1. 언어에 종속되지 않고
  2. 변화에 빠르게 대응할 수 있으며
  3. 각 모듈의 관리가 쉬워진다

라는 장점이 있다.

컨테이너는 마이크로서비스 구조에서 가장 많이 사용되고 있는 가상화 기술이다.

이와 같은 컨테이너 기반의 마이크로서비스는 도커 스웜 모드, 쿠버네티스 등을 이용하여 구현하는 것이 일반적이다.


이러한 모놀리스 방식을 대체하기 위해 도커 스웜 모드, 쿠버네티스 등을 이용해 마이크로서비스 구조를 구현한다.

Last Updated: