👉 이 게시글은 도커 / 쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈 강의를 바탕으로 작성되었습니다.
서비스가 고도화되면 원할한 이용을 위해 관리해야 할 서버가 기하급수적으로 늘게 된다. 이렇게 많은 서버를 어떻게 관리하냐에 대해 다양한 방법론이 제기되었는데, 그 중 하나는 가상 머신(VM)이다. 서버의 상태 및 환경을 스냅샷으로 관리할 수 있고, 설치가 용이하다는 이점이 있었으나 가상화 엔진 구동 및 OS의 개별적 구동으로 인해 속도가 매우 느려 지속 가능한 서버 관리의 방법론으로는 적합하지 않다는 평가를 받게 되었다.
이러한 상황에서 2013년 dotCloud라는 회사는 docker라는 오픈소스 플랫폼을 발표하게 된다. 이 회사가 발표했던 docker 서비스의 핵심은 docker가 설치된 곳이라면 어떤 컨테이너든 모든 실행할 수 있는 환경을 만들 수 있다는 것이다. 컨테이너는 격리된 환경으로 구성되기 때문에 테스트용 서버도 간단히 생성 가능했고, 의존성과 이식성(portability) 문제를 완벽하게 해결하였다. 결국 dotCloud는 Paas 사업을 중단하고, 상용을 docker로 변경하여 docker 플랫폼 운영에 집중하게 된다.
해운 업계에서는 다양한 종류의 화물을 어떻게 하면 효율적으로 운반할 수 있을지 고민하는 과정에서 만들어진 표준화된 컨테이너가 존재한다. 즉, 어떤 물건을 싣더라도 표준화된 화물선만 있다면 여러 개의 화물을 효과적으로 운반할 수 있게 된 것이다. 이러한 개념은 프로그래밍에도 똑같이 적용될 수 있다.
기업에서 특정 서비스를 운영한다고 가정하면, 하나의 환경에서 모든 서비스가 돌아가는 것이 아니라 기능별로 나누어서 여러 기능을 가진 애플리케이션이 결합되어 작동하게 된다. 이렇게 기능별로 다양한 애플리케이션을 효과적으로 제어하기 위해서 컨테이너라는 개념이 등장한다.
즉, 애플리케이션이 동작하기 위해 필요한 각종 요소들을 표준화된 방식으로 묶어 동작할 수 있도록 하는 구조를 컨테이너라고 한다. 이렇게 컨테이너 단위로 묶게 되면, 하나의 컴퓨팅 환경 안에서도 여러 개의 애플리케이션을 효율적으로 나누어서 관리할 수 있게 된다.
이는 가상 머신(VM)의 개념과 유사하나, 큰 차이점이 있다. 가상 머신은 하나의 OS 위에 별도의 OS를 추가적으로 구동해야 하기 때문에 속도가 느려지지만, 컨테이너는 하나의 운영체제를 논리적인 구획으로 구분하여 사용하는 것으로 OS를 추가로 실행하는 것이 아니기 때문에 가상 머신에 비해 성능적으로 손해보는 부분이 덜하다.
위 그림과 같이 컨테이너는 애플리케이션이 실행되는 환경 및 의존성에 관련된 정보를 담고 있다. 애플리케이션을 표준화된 영역에 패키징한 것이다. docker는 Window, Linux, MacOS와 같은 운영체제를 모두 지원한다.