리뷰: 도약을 눈앞에 둔 '도커(Docker) 1.0'

InfoWorld

앱과 서비스를 개발 단계에서 프로덕션 단계로, 또는 한 서버 환경에서 다른 서버 환경으로 손쉽게 마이그레이션할 방법을 찾는 사람이라면 아마도 이미 도커(Docker)를 알고 있을 것이다. 리눅스 컨테이너 솔루션인 도커는 아직 프로덕션용으로 쓰기엔 설익었다는 시각이 지배적이지만 그 강력한 파급력은 이미 입증된 지 오래다.

도커 팀은 프로덕션용 릴리스를 최종 발표하기 위한 작업을 꾸준히 진행해 도커 1.0에 이르러 마침내 그 목표를 달성한 것으로 보인다.

도커 1.0이 프로덕션 환경에 걸맞은 준비가 된 것은 중요한 여러 개선 사항들 덕분이다. 이전 버전에서는 내부 브리지가 필요했지만 이제는 호스트 네트워크 인터페이스에 직접 연결이 가능하다.

연결된 도커 컨테이너는 호스트 이름으로 서로 찾을 수 있고 호스트 파일은 정확한 호스트를 반영하도록 수정된다. 또한 도커는 시큐리티 인핸스드 리눅스(SELinux)에서 잘 작동하며 뛰어난 모니터링 기능을 지원하고 각 컨테이너에 대해 시간 스탬프가 적용된 로그를 제공하고, 여러 엔드포인트로 레지스트리 미러를 지원해 예비성과 안정성을 높여준다.

이는 모두 중요한 개선 사항들이며, 이를 통해 도커는 여러 사용 사례와 프로덕션 시나리오에 걸쳐 훨씬 더 큰 효용성을 갖추게 됐다. 특히 비용도 들지 않는다. 도커는 아파치 2.0 오픈 소스 라이선스에 따라 무료로 배포된다.

도커 개요
가상 머신과 비슷하지만 훨씬 더 가벼운 도커 컨테이너(Docker container)는 여러 호스트 서버 사이에서 애플리케이션과 서비스를 매끄럽게 이동할 수 있게 해준다. 또한 물리적 서버, 가상 서버 또는 클라우드 인스턴스에 걸쳐 애플리케이션과 서비스의 탄력성과 간편한 확장(스케일링)을 가능하게 해주는 버전 관리 및 이미지 관리 도구를 포함한다.

예를 들어 멤캐시(memcached) 서비스 또는 아파치 웹 서버 전용 도커 컨테이너를 만들 수 있다. 이 컨테이너는 우분투 또는 센트OS(Cent OS)와 같은 표준 리눅스 기반에서 만들 수 있으며, 보통 리눅스 시스템에서 하듯 원하는 서비스를 설치하고 구성할 수 있다. 일단 컨테이너가 구축되면 이 컨테이너를 깃(Git) 버전 제어에 체크인하고 다른 시스템에서 체크아웃하고 즉시 시작해서 실용적인 프로덕션 서비스로 만들 수 있다.

따라서 이 멤캐시 인스턴스를 복제해서 가상 서버, 물리적 서버, 아마존 클라우드 인스턴스 또는 기타 도커를 실행할 수 있는 모든 곳에서 실행할 수 있다. 호스트 간의 서비스 종속성에 대해 신경쓸 필요도 없고 애플리케이션 설치, 하드웨어 에뮬레이션 또는 기타 전통적인 가상화의 골칫거리에 대해 걱정할 필요도 없다. 올바르게 구축한 컨테이너를 원하는 위치에서 시작하기만 하면 된다.

도커의 동작 방식
도커는 리눅스 시스템 이미지를 기반으로 컨테이너를 만든다. 버추오조(Virtuozzo)와 같은 다른 반가상화(paravirtualization) 도구와 마찬가지로 모든 인스턴스는 본질적으로 호스트 시스템의 커널에서 실행되지만, 호스트 환경과 분리된 자체 런타임 환경에 갇힌다.

도커 컨테이너를 시작하거나 만들면 이 컨테이너 내에 활성 프로세스가 실행 중인 경우에만 컨테이너도 활성 상태가 된다.

데몬 프로세스를 시작하면 포어그라운드(foreground)에서 프로세스의 활성 상태가 중단되므로 컨테이너는 즉시 종료된다. 포어그라운드에서 프로세스를 시작하면 컨테이너는 해당 프로세스가 종료될 때까지 정상적으로 실행된다.

동일한 호스트의 구획화된 환경에서 "일반적인" 가상 서버 인스턴스를 설정하는 다른 반가상화 도구와 다른 점이다. 이런 인스턴스는 활성 포어그라운드 프로세스가 없어도 지속된다.

도커는 대부분의 주요 리눅스 배포판과 맥 OS X 및 윈도우에 설치할 수 있다. 다만 맥 OS X과 윈도우의 경우 에뮬레이션된 가상 머신을 호스트로 사용해야만 가능하다.


대부분의 경우 호스트에 도커 런타임을 실행하는 과정은 매우 간단해서, 많은 리눅스 배포판의 일반적인 패키지 관리 명령만 사용하면 된다. 도커 웹 사이트를 방문하면 광범위한 리눅스 배포판과 클라우드 서비스, 그리고 맥과 윈도우에 대한 모든 설치 지침을 볼 수 있다.

도커가 설치되면 다음과 같은 간단한 명령으로 컨테이너를 만들 수 있다.

$ sudo docker run -i -t ubuntu /bin/bash

이 명령은 도커에게 최신 우분투 이미지를 다운로드하고(호스트에 최신 버전이 없는 경우) 컨테이너 내에서 /bin/bash 명령을 실행하도록 지시한다. 이 명령은 새 컨테이너 내에서 루트로 실행되며, 다음과 같이 새 컨테이너에서 실행되는 루트 명령 프롬프트가 표시된다.

root@2e002f3eb1b2:/#

여기서 새 리눅스 설치에서 가능한 거의 모든 작업을 실행할 수 있다. apt-get update를 실행하고 새 소프트웨어를 설치하고 설치한 소프트웨어를 구성하고 스크립트를 작성하고 다른 리눅스 서버 인스턴스를 다루듯 컨테이너를 사용할 수 있다.

다만 명령줄에서 나오면 컨테이너 실행이 중지된다. 컨테이너에서 아파치 프로세스를 시작하고 웹 페이지를 서비스하기 시작했다면 이 경우 웹 서버도 중지된다. 따라서 웬만하면 애플리케이션 스택이 아닌 단일 서비스 전용으로 컨테이너를 만드는 것이 좋다. 하나의 컨테이너에서 여러 서비스를 실행할 수는 있지만 이 작업은 필요 이상으로 까다롭다.

도커 사용하기
도커는 중앙 '도커' 실행 파일에 필요한 모든 도구를 제공하는 명령줄 도구다. 따라서 전체적으로 사용하기가 무척 간편하다. 예를 들어 다음과 같이 실행 중인 컨테이너를 확인한다.



또는 사용 가능한 이미지와 각 이미지의 버전을 확인한다.


이미지의 내역을 보는 것도 있다.
이 명령은 명령줄 인터페이스의 유용한 바로 가기를 보여준다. 즉, 이미지 ID의 첫 번째 몇 글자만 지정하면 된다. 앞에서 'd95'만으로 d95238078ab0 이미지의 내역을 불러온 것을 볼 수 있다.

이미지의 크기가 상당히 작은 것을 알 수 있는데, 이는 도커가 상위 이미지로부터 델타(deltas)를 제작하고 컨테이너별로 변경 사항만 저장하기 때문이다. 따라서 300MB의 상위 이미지가 있고, 50MB의 추가 애플리케이션이나 서비스를 컨테이너 내에 설치하는 경우 컨테이너와 그 결과 이미지의 크기는 50MB 정도가 된다.

단일 컨테이너에 대한 사양을 포함하는 파일인 도커 파일을 사용해 도커 컨테이너 생성을 자동화할 수 있다. 예를 들어 도커 파일을 생성해 적절한 네트워킹을 구성한 우분투 컨테이너를 설정하고 새 컨테이너 내에서 다양한 명령을 실행하고 소프트웨어를 설치하거나 기타 작업을 수행한 다음 컨테이너를 시작할 수 있다.

컨테이너 네트워킹
초창기 버전 도커의 네트워킹은 호스트 브리징을 기반으로 했지만 도커 1.0은 컨테이너에서 호스트 이더넷 인터페이스로 직접 연결할 수 있게 해주는 새로운 형태의 네트워킹을 포함한다.

기본적으로 컨테이너는 기본 내부 브리지에 연결되는 인터페이스와 루프백을 갖게 되지만 필요한 경우 직접 접근이 가능하도록 구성할 수도 있다. 일반적으로 직접 접근 방식이 브리징 방식보다 속도가 빠르다.

그렇지만 브리징 방식은 무척 유용한 경우가 많고, 호스트에서 자동으로 내부 네트워크 어댑터를 만들고 여기에 호스트 자체에 사용되지 않는 서브넷을 할당하는 방식으로 구현된다.

그러면 이 브리지에 새 컨테이너가 연결될 때 자동으로 주소가 할당된다. 시작될 때 호스트 인터페이스와 포트에 연결되도록 컨테이너를 구성할 수 있다.

따라서 아파치를 실행하는 컨테이너가 시작되면 호스트의 TCP 포트 8080(또는 무작위 포트)에 연결되고, 다시 컨테이너 자체의 포트 80으로 유도된다.

스크립팅과 관리 제어 기능을 사용해서 어디서든 도커 컨테이너를 시작하고, 사용 중인 포트를 수집하고, 해당 서비스를 사용해야 하는 애플리케이션이나 서비스 스택의 다른 부분에 이 정보를 전파할 수 있다.

실제 환경의 도커
도커는 이전 몇 차례 릴리스에서부터 제대로 다루기만 한다면 프로덕션용으로 손색이 없었는데, v1.0이 릴리스되면서 본격적인 주목을 받게 될 것이다. 숙련된 리눅스 관리자라면 비교적 짧은 시간 내에 도커를 익히겠지만 도커 온라인 데모에서 직접 살펴보면서 판단할 수 있다.

도커는 리눅스 관리자와 설계자를 위한 풍부한 효용성과 기능을 갖춘, 실용적이고 기본적인 백엔드 인프라스트럭처의 좋은 예다.

그러나 마우스 커서를 사용한 클릭 인터페이스에 익숙한 사람에게는 별 매력을 주지 못할 가능성이 높다.

그래도 큰 문제는 없다. 도커는 앞으로 발전해 나갈 여지가 많고(예를 들어 이미지 버전 관리와 사설 레지스트리), 도커가 제공하는 능률화를 활용할 수 있는 영역도 다양하다(예: 네트워킹). 특히 이번 1.0 릴리스는 사람들을 도커로 이끌기에 충분하다. editor@itworld.co.kr