Docker

이재홍 http://www.pyrasis.com 2014.08.02 ~ 2014.09.20

Docker 이미지와 컨테이너

Docker는 이미지와 컨테이너라는 개념이 있습니다. 먼저 베이스 이미지가 있는데, 리눅스 배포판의 유저랜드만 설치된 파일을 뜻합니다. 보통 리눅스 배포판 이름으로 되어 있습니다. 또는, 리눅스 배포판 유저랜드에 Redis나 Nginx 등이 설치된 베이스 이미지도 있습니다. 그래서 Docker 이미지라고 하면 베이스 이미지에 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 파일 하나로 만든 것을 말합니다.

각 리눅스 배포판 이름으로 된 베이스 이미지는 배포판 특유의 패키징 시스템을 이용할 수 있습니다. 원한다면 베이스 이미지를 직접 만들 수도 있습니다.

매번 베이스 이미지에 필요한 프로그램과 라이브러리, 소스를 설치하면 용량이 큰 이미지가 중복되어 생성될 것이라고 생각하기 쉽습니다. Docker 이미지는 베이스 이미지에서 바뀐 부분(Δ)만 이미지로 생성하고, 실행할 때는 베이스 이미지와 바뀐 부분을 합쳐서 실행합니다.


그림 1-10 Docker 이미지(출처: http://www.slideshare.net/dotCloud/why-docker)

유저랜드
OS는 메모리 사용을 기준으로 커널 공간과 유저 공간으로 나눌 수 있습니다. 여기서 유저 공간에서 실행되는 실행 파일과 라이브러리를 유저랜드(userland)라고 합니다. 리눅스는 커널만으로 부팅할 수 없으므로 부팅에 필요한 최소 실행 파일과 라이브러리 조합을 뜻하기도 합니다. 보통 리눅스 배포판에서 유저랜드는 부팅에 필요한 실행 파일과 라이브러리 그리고 고유의 패키징 시스템을 포함합니다.

그림 1-11는 Docker 이미지 간의 의존 관계를 보여줍니다. Docker 이미지는 16진수로 된 ID로 구분하고, 각각의 이미지는 독립적입니다. centos:centos7 이미지는 511136ea3c5a, 34e94e67e63a, b517b77b1a65가 조합된 것입니다. centos:centos6 이미지에 서비스 운영에 필요한 프로그램을 설치한 뒤 Docker 이미지를 생성하면 example:0.1과 같은 형태가 됩니다.


그림 1-11 Docker 이미지 의존 관계

즉 Docker는 이미지를 통째로 생성하지 않고, 바뀐 부분만 생성한 뒤 부모 이미지를 계속 참조하는 방식으로 동작합니다. Docker에서는 이를 레이어라고 합니다.

Docker 이미지는 파일이기 때문에 저장소에 올린 뒤 다른 곳에서 받을 수 있습니다. 그리고 저장소에 올릴 때는 자식 이미지와 부모 이미지를 함께 올립니다. 받을 때도 마찬가지로 부모 이미지를 함께 받습니다. 이후에는 내용이 바뀐 이미지만 주고받습니다.

Union mount, Union File System
생성된 Docker 이미지는 읽기 전용 상태입니다. 여기서 내용이 바뀌면 이미지를 수정하지 않고, 쓰기 이미지를 생성한 뒤 내용을 기록합니다. 이러한 방식을 Union mount라고 하며 Union mount를 지원하는 파일시스템을 Union File System이라 합니다.

Docker 컨테이너는 이미지를 실행한 상태입니다. 이미지로 여러 개의 컨테이너를 만들 수 있습니다. 운영체제로 보면 이미지는 실행 파일이고 컨테이너는 프로세스입니다. 이미 실행된 컨테이너에서 변경된 부분을 이미지로 생성할 수도 있습니다.

Docker는 특정 실행 파일 또는 스크립트를 위한 실행 환경이라 보면 됩니다. 리눅스/유닉스 계열은 파일 실행에 필요한 모든 구성요소가 잘게 쪼개어져 있습니다. 시스템 구조가 단순해지고 명확해지는 장점이 있지만 의존성 관계를 해결하기가 어려워지는 단점이 있습니다. 그래서 리눅스 배포판 별로 미리 컴파일된 패키지(rpm, deb 등)라는 시스템이 나왔습니다. 하지만 서버를 실행할 때마다 일일이 소스를 컴파일하거나 패키지를 설치하고, 설정하려면 상당히 귀찮습니다.

서버가 한 두 대라면 큰 어려움이 없겠지만 클라우드 환경에서는 서버를 몇 십, 몇 백개를 생성해야 합니다. 서버 구성을 미리 해놓은 Docker 이미지를 사용하면 실행할 서버가 몇 개가 되든 손쉽게 해결할 수 있습니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

30 November 2014