도커는 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트입니다.
가상머신 : 기존의 가상화 머신들은 하이퍼바이저(hyperVisor)를 이용해 여러개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식으로 각각의 운영체제들을 게스트라 하며 게스트 운영체제들은 다른 게스트들과는 독립된 공간과 자원을 할당받아 사용합니다. 다만 시스템 자원을 가상화하고 생성하는등의 관리를 하는 작업들은 하이퍼바이저의 관리를 통해 이루어지면서 성능의 손실이 발생합니다. 그리고 운영체제를 사용하기 위해 필요한 리소스들때문에 이미지의 크기가 커지며 애플리케이션으로 배포하기에 부담스럽다는 단점이 있습니다.
도커의 컨테이너 : 가상화를 하기 위해 chroot, namespace, cgroup을 사용함으로써 프로세스 단위의 격리환경을 구축하므로 성능의 손실이 거의 없으며, 컨테이너에 필요한 커널은 호스트의 커널을 공유하고, 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행파일만으로 이미지를 만들기때문에 이미지의 크기가 작고 빠르다는 장점이 있습니다.
애플리케이션의 개발과 배포가 편리해집니다.
서버를 부팅할 때 실행되는 운영체제를 일반적으로 호스트OS 라고 부르며, 도커 컨테이너는 이 호스트 위에서 실행되는 격리된 공간입니다. 따라서 컨테이너 자체에 특별한 권한을 주지 않는 한 호스트OS에는 영향을 끼치지 않으므로 독립된 개발 환경을 보장받을 수 있습니다.
컨테이너를 배포하기 위해선 도커 이미지 라고 하는 일종의 패키지를 만들어서 전달하면 됩니다. 이는 배포하려는 서버에 따로 패키지를 설치하거나, 라이브러리등의 의존성없이 컨테이너로서 똑같이 복제, 사용이 가능하므로 개발/운영 환경의 통합이 가능합니다. 게다가 위에 컨테이너 설명처럼 OS 커널을 포함하고 있지 않으므로 이미지의 크기가 적으며, 이미지 내용을 레이어 단위로 구성하여 중복되는 레이어를 재사용할 수 있어 배포속도가 매우 빨라진다는 장점이 있습니다.
여러 애플리에키션의 독립성과 확장성이 높아집니다.
기존의 소프트웨어 구조는 모놀리스(Monolith)구조 애플리케이션이라 하며, 여러 모듈들이 상호작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식입니다. 하지만 점점 프로그램이 거대하고 복잡해지면서 확장성과 유연성이 줄어들며 하나의 모듈에서 장애가 발생할 경우 전체의 장애로 번진다는 점때문에 대체하기 위해 나온게 마이크로 서비스(MiroService)구조 입니다.
마이크로서비스구조 : 여러 모듈을 독립된 형태로 구성하여 언어에 종속되지 않고 변화에 빠르게 대응하며 각각 모듈의 관리가 쉬워진다는 장점이 있습니다. 그리고 컨테이너는 빠른 생성, 시작, 모듈의 독립된 환경제공등에 이유로 마이크로서비스에서 가장 많이 사용되는 가상화 기술입니다. 보통 데이터베이스와 웹 서버 컨테이너로 분리할 수 있고, 부하 발생 시 컨테이너만을 동적으로 늘려서 부하분산이 가능하는 등 이미지 별로 관리하기 때문에 유지보수가 용이합니다. 그리고 이 컨테이너들을 관리하는 것들이 도커 스웜모드, 쿠버네티스등의 컨테이너 오케스트레이션 플랫폼들입니다.
도커는 Docker DeskTop과, Linux환경등 다양한 운영체제에서 사용할 수 있으나, 되도록이면 최적화된 리눅스 환경에서 사용하는 것을 권장합니다.