logo
Published on

Docker의 기본

Authors
  • Name
    Twitter

Docker란 ?

컨테이너 기반의 오픈소스 가상화 플랫폼. 프로세스를 격리시켜서 사용하는 방식이기 때문에 가볍고 빠르며 하나의 서버에 여러 개의 컨테이너를 실행해도 서로 영향을 미치지 않고 독립적으로 실행되어 가벼운 VM을 사용하는 느낌을 준다.

Container VS VM

기존의 VM(Virtual Machine)에서의 가상화 방식은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이었다. 여러가지 OS들을 가상화하여 사용할 수 있었지만 무겁고 느려서 운영환경에서는 사용할 수 없었다.

이를 개선하기 위해 프로세스를 격리하는 방식이 등장하게 되었는데 이 방식이 바로 컨테이너 방식이다. 마치 가벼운 VM을 실행하는 느낌을 주며 컨테이너에 터미널로 접속하여 명령어도 입력이 가능하며 패키지도 물론 설치가 가능하고 여러 개의 프로세스를 백그라운드로 실행할 수 도 있다.

컨테이너를 새로 만드는 데 걸리는 시간은 겨우 1 ~ 2초 밖에 걸리지 않아 기존의 가상머신들과 비교해서 월등히 빠른 성능을 보여준다.

Image

도커에서 이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있으며 추가되거나 변하는 값은 컨테이너에 저장된다. 즉, 컨테이너 실행을 위한 모든 정보를 가지고 있기 때문에 그 이상의 파일을 설치하거나 할 필요가 전혀 없다. 이미지 하나만 있으면 ubuntu든 mysql이든 컨테이너를 손쉽게 생성할 수 있게 된다.

Image layer

보통 Image 하나 당 수 백 메가(MB)에 이르는데, 기존 Image에 파일 하나 추가했다고 새로 생성한다면 매우 비효율 적일 것이다.

도커에서는 이러한 문제를 해결하기 위해 레이어(layer)라는 개념을 사용하고 있다. 예를 들어 기존의 ubuntu 이미지가 A + B + C 로 이루어져 있다면 이를 베이스로 만든 nginx의 이미지는 A + B + C + nginx가 된다. 즉, 기존 레이어를 제외한 새로운 레이어만 받으면 되기 때문에 효율적인 이미지 관리가 가능하다.

컨테이너를 생성할 때도 마찬가지로 레이어 방식을 사용하는데 기존의 이미지 레이어를 올린 후 그 위에 읽기/쓰기 레이어를 추가함으로써 컨테이너가 실행 중에 생성하는 파일이나 변경한 내용 등은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용하게 된다.

Dockerfile

이미지를 만들어 관리하면서 불편한 점이 생기게 되는데 해당 이미지가 어떤 목적으로 만든 이미지였는지 기억하기 어렵게 되어버린다. 그래서 도커에서는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL언어를 이용하여 이미지 생성 과정을 적어 관리함으로써 누구나 쉽게 이미지 생성 과정을 보며 수정할 수 있게 된다.

Docker Hub

도커 이미지들은 보통 수 백 메가(MB)에서 많게는 수 기가(GB)가 넘는 경우도 흔하다. 이러한 이미지들을 서버에 저장하고 관리하는 것은 쉽지 않은데 도커에서는 Docker Hub를 통해 공개 이미지를 무료로 관리해준다.

쉬운 Command와 API

도커 클라이언트의 커맨드 명령어는 잘 만들어져 있어서 직관적이고 사용하기 쉽다. 또한 http 기반의 RestAPI도 지원하여 확장성이 좋다.