개발 및 운영에 필요한 서비스들의 수가 늘어나며 서비스들의 관리 또한 쉽지 않다.
서비스들의 관리를 효율적이고 되도록이면 편하게 할 수 있는 방법으로 Docker는 매우 유용하였다.
따라서 Docker를 아직 모르거나 새롭게 공부하시는 분들께 도움이 되고자 Docker에 대해 여러 포스팅에 걸쳐 설명해보려고 한다.
시작해보겠다.
Docker란?
Container란?
Container를 사용하여 원하는 서비스를 실행하고 싶다면 서비스에 필요한 환경들 OS와 서비스들이 존재하는 환경을 Image로 패키징하여 이를 Container로 띄워 올린다.
여기서 Image는 완전한 애플리케이션 패키지다. 위 그림과 같이 애플리케이션과 실행에 필요한 모든 것이 들어 있다. 하지만 위 그림처럼 한 이미지에 여러 서비스를 함께 올려 쓰지는 않고 DB, WEB 등 개별적인 이미지로 관리하기 때문에 위 그림은 이해의 용도로만 기억하자.
그리고 이 Image를 배포하기 위한 구조, Docker hub라는 것을 통해서 배포된 Image들을 가져와 사용할 수도 있으며 또한 공유할 수 있다. (Github와 비슷하다고 생각하면 된다.)
이 Image를 가지고 Docker가 설치된 다른 환경으로 옮겨 Container로 띄우기만 하면 동일한 서비스를 독립적으로 실행시킬 수 있다.
위 그림 처럼 A서버 -> B서버로 서비스 운영환경을 옮겨야하는 상황이 된다면 A서버 환경을 B서버에 맞게 설치 할 필요가 없는 것이다. Docker 설치만 한 후 Image만 옮겨와 Container로 올리기만 하면 된다.
위 그림은 각 VM과 Docker를 사용하는 환경을 표현한 것이다.
VM ware나 Virtual Box 등을 통해 보통 가상의 OS를 설치하고 똑같이 필요한 서비스들을 설치하여 테스트 환경으로 사용해 봤을 것이다. 공통적으로 물리적인 하드웨어 위에 HostOS가 동작 되는데 일반적으로 Windows 또는 Mac, Linux일 것이다. HostOS 이후 부터는 구조가 다르다. 각각의 특징을 살펴보자.
VM의 특징은 다음과 같다.
- VM으로 설치한 OS는 HostOS 와는 다른 독립적으로 존재한다.
- VM으로 설치한 OS를 사용하기 위해서는 HostOS를 이용하여 하이퍼바이저라는 프로그램이 가상화를 위해 개입되어야 한다.
- 하이퍼바이저 사용에 따라 성능저하 및 메모리 혹은 디스크와 같은 리소스를 가상 환경에 확보할 필요가 있어 리소스 소비량이 많아진다.
다음은 Docker의 특징이다.
- Docker Container는 VM이 아닌 Docker Engine을 사용하여 동작한다.
- Container의 실체는 HostOS 상의 프로세스로 각각의 Container의 형태로 격리된 상태로 움직인다.
- 격리된 상태의 프로세스는 HostOS에서 실행되는 커널 기능이 사용된다.
- Container는 VM과는 다르게 하이퍼바이저와 같은 프로그램이 개입하지 않으며 또한 각각의 Container마다 커널이라는 OS기능이 별도로 실행되지 않는다.
결국 Container는 Docker Engine를 사용하여 동작하고 HostOS의 커널 기능이 사용되는 격리된 프로세스로 VM과 다르게 성능저하나 리소스 소비량을 일으키는 프로그램의 개입이 없다. (커널은 메모리에 상주하는 OS의 부분으로 지금은 OS의 핵심적인 부분이라는 것만 알고 넘어가자)
따라서 기본적으로 HostOS를 통해 별도의 OS상에 서비스를 독립적으로 실행시키는 작업은 비슷하지만 Docker를 사용하게 되면 격리된 상태의 프로세스로 개별적인 서비스들을 동작시켜 운영할 수 있다.
Docker를 사용하면 개발 및 운영에 필요한 도구들도 이미 Image로 배포되어 있기 때문에 서버에 쉽게 구축을 할 수 있다. 이번 포스팅은 기본적인 이론만 다루었지만 다음 포스팅부터 기초 예제부터 유용하게 활용할 수 있는 Docker 기술들을 포스팅해 나가겠다.