도커(Docker)와 컨테이너(Container) : 컨테이너를 사용하는 이유, 컨테이너와 가상머신의 차이
도커와 컨테이너는 무엇일까?
최근 클라우드 컴퓨팅에서는 컨테이너 기반 가상화가 기존의 하이퍼바이저 기반의 가상화 기술을 대체하며 각광받고 있다. 특히 구글은 Gmail, Google Drive를 포함한 모든 서비스를 컨테이너로 제공한다고 발표하였으며, 현재 자사의 컨테이너 플랫폼인 ‘쿠버네티스(Kubernetes)’를 통해 2014년부터 매주 20억 개 이상의 컨테이너를 구동하고 있다.
도커 플랫폼이 설치되면 컨테이너로 묶인 애플리케이션을 어디서든 독립적으로 실행할 수 있다는 장점을 가진다. 클라우드 컴퓨팅 기술이 등장하면서 빠르게 인프라를 구축할 수 있게 되었다. 따라서 서비스를 빠르게 배포할 수 있게 되는 기술인 도커가 등장했다.
도커(Docker)
도커(Docker)는 가상실행 환경을 제공해 주는 오픈소스 플랫폼이다. 컨테이너를 사용해서 애플리케이션 배포를 쉽게 한다.
*오픈소스 플랫폼은 누구나 프로젝트를 보고, 사용하고, 수정하고, 배포할 수 있다.
- 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 더욱 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트이다.
- VM을 이용하여 추가적인 OS를 설치하여 가상화하는 방법은 성능문제가 있었고 이를 개선하기 위해 프로세스를 격리 하는 방식인 도커가 등장 했다. 기존에는 성능 하락이 큰 VM을 이용했지만 도커를 사용하면서 확장성, 이식성, 표준성이라는 장점이 생겼다.
컨테이너(Container)
컨테이너는 가상실행 환경이다. 애플리케이션을 환경에 구애받지 않고 실행할 수 있도록 필요한 모든 요소(런타임, 라이브러리, 소스코드)를 모아서 별도의 서버인 것처럼 사용하는 기술이다.
OS의 기능(namespace, cgroups)을 이용해서 프로세스를 격리시켜 동작한다. 리눅스의 namespace는 커널 관련 영역을, cgroups는 자원 관련 영역을 분리해 주는 역할을 한다.
도커 이미지가 메모리 위에 상주하여 실제 코드가 수행되는 프로세스다. 컨테이너가 종료되면 모든 데이터가 휘발된다.
*커널(Kurnel)은 하드웨어를 직접 제어하며 하드웨어와 소프트웨어가 커뮤니케이션할 수 있도록 한다. 운영체제의 핵심이 되는 컴퓨터 프로그램이다. 메모리나 저장장치 내 운영체제 주소 공간을 관리한다.
*셸(Shell)은 사용자가 입력한 명령어를 커널이 이해할 수 있게 변환하여 전달한다.
이미지(Image)
이미지란 도커에서 컨테이너를 실행하기 위한 모든 파일과 환경설정을 패키징 한 것이다. 컨테이너를 만들기 위해 필요한 템플릿이며 사용자가 실행할 코드가 들어있는 바이러니이다. CD와 마찬가지로 한 번 생성하면 수정할 수 없다. (서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일 등의 묶음이다.)
하나의 도커 이미지를 통해 여러 개의 도커 컨테이너를 만들 수 있다. 이미지를 이해하기 위해서 CD, 붕어빵 틀, 도넛 틀의 비유를 많이 든다. 사용자가 CD만 들고 있으면 CD 플레이어가 설치된 어느 컴퓨터에서든지 그 CD를 재생할 수 있듯이, 사용자가 도커 이미지(CD)만 가지고 있으면 어디에서든지 도커 프로세스(CD실행)를 실행할 수 있다.
docker images
docker run -p [port]
docker build
docker push
도커 파일(Dockerfile)
도커 이미지를생성하기 위해 필요한 문서이다.
데몬(Demon)
도커 데몬은 컨테이너가 정상적으로 수행될 수 있게 실행 환경을 제공한다.
레지스트리(Registry)
도커 이미지를 저장할 수 있는 원격 저장소다.
도커의 특징
- 컨테이너 기반의 오픈소스 가상화 플랫폼이다. (오픈소스: 공유, 수정이 자유롭다)
- 계속 바뀌는 서버 환경과 개발 환경 문제를 해결하기 위해 등장했다. (ex. 툴 업데이트, 툴 사용 변경)
- 기존에 서버와 개발 환경이 변경되면 컴퓨터 셋팅(개발 환경) 등을 다시하거나 그 과정에서 발생하는 문제들과 같이, 여러모로 불편한 점이 많았다.
- 도커가 등장하고 서버관리/개발 방식이(컨테이너) 완전히 편리하게 바뀌게 된다.
도커의 장점
- 표준화(standard): 도커를 사용하면 프로세스의 실행을 표준화할 수 있다. 동일한 형식으로 프로세스를 실행하고 관리할 수 있다.
- 이식성(portabilty): 프로그램이 어떤 환경에서 만들어졌는지 상관없이 도커 플랫폼 위에서 실행하면 동일한 실행 환경으로 프로세스를 작동할 수 있다.
- 경량화(lightweight): 도커는 실행되는 애플리케이션별로 커널을 공유해서 가상화보다 가볍다.
- 강한 보안(secure): 컨테이너라는 고립된 환경에서 실행되어 보안에 유리하다.
컨테이너와 가상머신의 차이
컨테이너와 가상머신은 리소스를 가상화하고 고립화(격리)하는 데 같지만, 동작 방식이 차이가 있다.
그러나 VM은 하드웨어 수준에서 가상화된다면 컨테이너는 OS 수준에서 가상화된다.
- 가상머신(VM): 기존 서버에 하이퍼바이저를 설치하고, Host OS 위에 게스트 OS와 APP을 패키징 한 VM을 만들어서 실행한다. 즉, 하드웨어 레벨에서 가상화를 지원한다.
- 컨테이너: 반면, 컨테이너는 OS 커널을 공유하면서 프로세스를 격리되어 있는 환경에서 실행한다. 따라서 컨테이너는 OS를 공유하며 사용하기 때문에 Docker Engine 위에 애플리케이션에 필요한 모든 파일을 패키징 한 컨테이너를 올린다. 즉, OS 레벨에서 가상화를 지원한다.
*OS 레벨 가상화란 운영체제의 커널(Kurnel)이 여러 격리된 사용자 공간 인스턴스를 갖출 수 있도록 하는 가상화하는 것이다.
가상머신과 도커 컨테이너의 장단점
- 가상 머신: 기존의 가상화 기술은 하이퍼바이저를 이용해서 여러 개의 운영체제를 하나의 호스트에서 생성하고 사용하는 방식이었다. 이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별된다. 하이퍼바이저에 의해 생성되고 운영되는 운영체제는 게스트 운영체제라고 하며, 각 Guest OS는 독립된 공간과 시스템 자원을 할당받아 사용한다.
- 장점: 완벽한 운영체제를 만들 수 있다
- 단점
- 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 반드시 하이퍼바이저를 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생한다
- 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신 이미지를 애플리케이션으로 배포하기 부담스럽다
- 도커 컨테이너: 가상화된 공간을 생성하기 위한 리눅스의 자체 기능을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 컨테이너에 필요한 커널은 호스트의 커널을 공유하여 사용하기 하낟. 컨테이너 안에는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 이미지 용량이 적다. 따라서 도커는 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점이 있다.
- 장점
- 독립된 개발 환경을 보장하여 애플리케이션의 개발과 배포가 편하다
- 도커 이미지를 운영 서버에 전달하면 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복사할 수 있기 때문에 개발/운영 환경을 통합할 수 있다
- 여러 애플리케이션의 독립성과 확장성이 높아진다
- 이미지 버전을 독립적으로 관리하기 때문에 유지 보수가 용이하다
- 독립된 개발 환경을 보장하여 애플리케이션의 개발과 배포가 편하다
- 장점
*하이퍼바이저란 프로세서나 메모리와 같은 다양한 컴퓨터 자원에 서로 다른 각종 운영 체계(OS)의 접근 방법을 통제하는 얇은 계층의 소프트웨어이다.
컨테이너의 특징
- 컨테이너는 게스트 OS와 하이퍼바이저가 없기 때문에 오버헤드를 줄임으로써 더 가볍게 프로세스를 실행할 수 있고, 컨테이너 복제와 배포가 더 용이하다.
- 여러 개의 컨테이너가 동일한 호스트에서 커널을 공유하며 실행된다.
- 커널을 공유하지만 개별적인 사용자 공간(user space)을 가진다.
- 컨테이너는 VM처럼 커널을 가지지 않기 때문에 더 가볍고 실행할 때 더 적은 리소스를 사용한다.