What is Docker

서버에서 말하는 컨테이너란?

: 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 일반PC, AWS, Azure, Goolge Cloud등 어디서든 실행할 수 있다.

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술입니다. 가상화 기술의 하나지만 기존 방식과는 차이가 있다.

도커가 나오게된 배경

  1. OS 가상화 : VMware, VirtualBox
    장점

: 여러가지 OS를 가상화 할 수 있다(윈도우에서 리눅스 사용) 비교적 사용법이 간단하다.

단점

: 전체적으로 무겁고 느리기 때문에 운영환경에서 사용이 불가능하다.

  1. CPU 가상화, 반가상화 : OpenStack, AWS, Rackspace
    장점

: 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상되었다.

단점

: 하지만 전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 성능 문제가 있었다

이를 개선하기 위해 프로세스를 격리하는 방식이 등장한다.

  1. 프로세스를 격리 : Docker, cgroups, LXC
    장점

: 리눅스에서는 이 방식은 리눅스 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작합니다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.

1
2
Docker의 기본 네트워크 모드는 Bridge모드로 약간의 성능 손실이 있다.  
네트워크 성능이 중요한 프로그램의 경우 --net=host 옵션을 설정하면 해결할 수 있다.
  1. 하나의 서버에서 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM을 사용하는 느낌을 준다.
  2. 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get이나 yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있다.
  3. CPU나 메모리 사용량을 제한할 수도 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.

도커 이미지

도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념이다.

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다. (immutable)

컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

말 그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.

이제 새로운 서버가 추가되면 미리 만들어놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다.

한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천 대의 서버도 문제가 없다.

도커 이미지는 컨테이너를 실행하기위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가에 이른다. 기존 이미지에서 파일 하나 변경되었다고 수백메가를 다시 다운받는다면 매우 비효율적인 작업이 된다.

레이어 Layer

이러한 문제를 해결하기위해 레이어Layer라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다. 이미지는 여러개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다. 사용자는 수정된 레이어만 다운을 받아 사용하면 되기 때문에 효율적으로 이미지를 관리할 수 있다.

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

가상화의 특성상 이미지 용량이 크고 여러대의 서버에 배포하는걸 감안하면 단순하지만 엄청나게 영리한 설계이다.

이미지 관리

이미지는 url 방식으로 관리하며 태그를 붙일 수 있습니다. ubuntu 14.04 이미지는 docker.io/library/ubuntu:14.04 또는 docker.io/library/ubuntu:trusty이고 docker.io/library는 생략가능하여 ubuntu:14.04로 사용할 수 있다. 이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있다.

Docker hub

도커 이미지의 용량은 보통 수백메가로 수 기가가 넘는 경우도 흔하다. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker hub를 통해 공개 이미지를 무료로 관리해준다.