Docker는 애플리케이션 영역에서 작동하는 가상화 플랫폼이다. 개발자와 시스템관리자는 docker를 이용해서 빠르고 쉽게 그들이 개발한 소프트웨어들을 격리된 운영체제 환경에서 테스트하고 배포할 수 있다.
물론 VM(가상머신)이라고 부르는 도구들을 이용해서 이런 일들을 할 수 있다. AWS와 같은 서비스를 이용한다면, (소프트웨어까지 모두 포함한)운영체제의 스냅샷을 떠서 배포할 수 있다. vagrant와 같은 가상화 기반 도구를 이용하면, 통합된 개발환경을 만들 수 있다.
실제 docker의 기본 개념의 기존의 가상화와 크게 다르지 않다. 단 접근방식에 있어 차이가 있다. 기존의 가상화라고 하면, 하드웨어와 그위에 올라가는 운영체제까지 한번에 띄우는 운영체제 가상화를 의미한다. 이런 방식의 가상화는 (기본적로 하드웨어+소프트웨어 조합이라서)이해하기가 쉽다는 장점과 (독립된 운영체제이기 때문에)격리가 매우 쉽다는 장점이 있다.
반면 단점도 있는데,
VM 방식의 경우 APM(Apache+PHP+Mysql)으로 구성된 간단한 웹서버를 배포하려면, 운영체제까지 전부 배포해야 한다. 3개의 소프트웨어와 약간의 하드디스크, 메모리 공간이 필요할 뿐인데, 운영체제를 모두 포함한 거대한 이미지를 배포해야 한다는 것은 상당한 낭비다. 운영체제를 실행하는 과정을 거쳐야 하기 때문에, 서비스 가동까지 꽤나 많은 시간이 걸리는 것도 단점이다.
도커는 하드웨어를 추상화하지 않는다. 운영체제의 자원을 모두 공유하며, 사실상 프로세스로 간주된다. 따라서 CPU, 메모리, 디스크 공간을 효율적으로 사용 할 수 있다. 운영체제를 가동할 필요가 없기 때문에, 매우 빨리 실행할 수 있다는 장점도 있다. 실제 실행해보면 일반 프로세스 실행하는 것과 별 차이가 없다.
그러면서도 가상화의 장점들인 네트워크, 디스크, 유저 격리를 할 수 있다. 사용자 입장에서는 컨테이너와 VM의 차이를 (거의)느낄 수 없다. 이런 도커의 특징은 특히 "애플리케이션의 서비스"에 아주 적합하다. Paas 혹은 Saas 애플리케이션의 개발과 배포에 유용하게 사용 할 수 있다.
Docker는 리눅스 컨테이너(Container) 시스템인 libcontainer[1]
를 이용해서 하나의 운영체제위에서 격리된 컴퓨팅 환경을 운영할 수 있도록 도와주는 애플리케이션 레벨 가상화 소프트웨어다.
Docker는 AUFS라는 파일 시스템을 사용하는데, 읽기 전용 부분과 쓰기 부분이 따로 있고 이들을 병합할 수 있다. 해서 읽기 전용으로는 공통으로 배포되는 정보를 저장해서 다른 개발자들과 공유할 수 있다. 예를들어 Ruby on Rails 환경을 만들었다면, ROR은 읽기 전용 공간에 저장해서 다른 개발자들에게 배포한 후, 쓰기 공간을 이용해서 프로그래밍하는 식의 개발이 가능하다.
VM과 컨테이너 방식을 비교한 그림이다.
컨테이너 방식이 훨씬 효율적이라는 걸 예상할 수 있다. VM 보다 더 가볍고, 더 빠르고, 더 작은 공간만을 필요로 한다. 기본적으로 프로세스 단위로 작동하기 때문에, 수백개이상의 컨테이너를 별 어려움 없이 돌릴 수 있다. Full virtualized 방식의 가상화 시스템에서 VM을 실행하려면, 수분의 시간이 걸린다. 컨테이너 방식에서는 (운영체제가 올라오는게 아니기 때문에)수 초면 된다.
Docker 개발을 위한 나름대로의 간단한 시나리오를 만들었다. 이 시나리오에 따라서 Docker 테스트를 진행한다.
Apache+PHP5 기반의 웹서비스를 개발하기로 했다.
서비스의 이름은 "HelloWorld"로 Hello world를 출력하는 하는 php 파일을 하나 가지고 있다.
웹 서비스를 위해 필요한 것들만 배포하고 싶다. 해서 기본적인 기능만 담고 있는 작은 우분투 이미지를 pull해서 개발한다.
Apache, php5, Mysql을 설치하고 Commit한다. 이 이미지의 이름은 "my_app"이다.
my_app 이미지를 Docker private registery에 등록 한다.
이제 개발자들은 my_app을 pull해서, 애플리케이션을 개발할 수 있다.
HelloWorld API 개발을 끝냈다면, 서비스 서버에서 pull한다.
이 경우 Apache+PHP5 까지를 이미지로 떠서 배포를 하고, HelloWorld 애플리케이션은 "git"으로 관리하는 방법을 사용할 수 있겠으나, docker 사용성을 테스트하는게 목적이니 그냥 HelloWorld까지 이미지로 만든다음 pull해서 서비스 하기로 했다.
docker 오피셜 사이트에서 설치할 수 있다. docker-ee(Enterprise Edition)와 docker-ce(Community Edition) 두개의 버전이 있다. 나는 CE 버전을 선택했다.
요즘 우분투 리눅스는 도커를 기본으로 배포하기는 한데, 좀 오래된 버전인 경우가 많다. 지금 설치돼 있는 도커를 삭제하고 새로 깔기로 했다.
Contents
1. 용어
2. Docker에 대해서
2.1. 컨테이너 vs VMs
2.2. Dock 이미지 관리
3. Docker 개발 Tutorial
3.1. 환경
3.2. 프로젝트 시나리오
3.3. 설치
3.4. 컨테이너 실행
3.5. Apache, PHP5 설치
3.6. 현재 컨테이너를 이미지로 commit 하기
3.7. Private Registery를 이용한 docker 이미지 배포
3.7.1. Docker Registery에 등록하기
3.7.2. Registery에 있는 이미지에서 컨테이너 만들기
4. 앞으로 할일
5. 참고
1. 용어
2. Docker에 대해서
2.1. 컨테이너 vs VMs
2.2. Dock 이미지 관리
3. Docker 개발 Tutorial
3.1. 환경
3.2. 프로젝트 시나리오
3.3. 설치
3.4. 컨테이너 실행
3.5. Apache, PHP5 설치
3.6. 현재 컨테이너를 이미지로 commit 하기
3.7. Private Registery를 이용한 docker 이미지 배포
3.7.1. Docker Registery에 등록하기
3.7.2. Registery에 있는 이미지에서 컨테이너 만들기
4. 앞으로 할일
5. 참고
Recent Posts
Archive Posts
Tags