소프트웨어는 OS와 라이브러리에 의존성을 띤다.
그러므로 하나의 컴퓨터에서 성격이 다른 (OS, 라이브러리 버전이 다른) 소프트웨어를 한 번에 실행할 때 어려움을 가질 수 있고 관련된 구성을 관리하기가 어렵다. 컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말한다.
컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 매커니즘을 제공한다.
가상머신 또한 독립적인 실행환경을 구성할 수 있도록 도와주는데, 차이는 다음과 같다.
HyperVisor 라는 것이 있다.
이는 컴퓨터가 가지고 있는 인프라 리소스들에 대해 VM 별로 배분하는 역할들을 한다.
또한 각 VM 에서는 독립적인 Guest OS를 가지고 있다.
따라서 독립적인 플랫폼을 하나씩 증가시킬 때마다 불필요한 OS를 만드는 작업에 대해서 계속해서 해야한다.
즉, 확장성이 떨어진다.
또한 메모리나 자원에 관해서 유동적으로 관리되는게 아니라 처음부터 정해놓고 실행하기 때문에 비효율적이다.
컨테이너의 경우 하나의 Host OS 위에서 마치 각각의 독립적인 프로그램처럼 관리되고 실행된다.
불필요한 OS 만드는 작업 및 Infra를 독립적으로 나눌 필요가 없어서 확장성이 좋고 빠르다.
- 애플리케이션 레벨 고립
- VM보다 빠른 셋업
- VM보다 메모리 덜 소요
- 마이그레이션, 백업, 전송이 쉬운데, 이는 VM과 비교해 크기가 작기 때문이다.
- 하드웨어와의 빠른 커뮤니케이션에 따라서 성능에 효과적일 수 있다.
- 애플리케이션 배치와 유지보수를 향상시킨다.
- 애플리케이션 전달 시간 감소
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼중 하나이다.
Docker를 사용하면 인프라에서 애플리케이션을 분리하여 컨테이너로 추상화시켜 소프트웨어를 빠르게 제공 할 수 있다.
이는 주어진 하나의 호스트 OS 안에서 여러 컨테이너를 동시에 실행 할 수 있다.
또한 도커는 컨테이너의 라이프 사이클을 관리하고 어플리케이션을 오케스트레이션(Work flow의 자동화)된 서비스로 배포할 수 있다.
예를들어 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있다.
도커 이미지는 컨테이너를 만드는데 사용되는 읽기 전용(Read-Only) 템플릿이다.
컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 도커 파일을 만든 후 Dockerfile 을 빌드하여 이미지를 만든다.
도커 이미지를 실행한 상태이다.
이미지로 컨테이너를 생성하면 이미지의 목적에 맞는 파일이 들어있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되는데, 이것을 도커 컨테이너라고 한다.
도커 컨테이너는 읽기 전용인 이미지에 변경된 사항을 저장하는 컨테이너 계층(Layer)에 저장한다.

도커 이미지를 도넛 레시피에 비유한다면, 도커 컨테이너는 해당 레시피를 이용해 만든 도넛으로 비유할 수 있다.
하나의 도넛 레시피에서 여러가지 맛의 도넛을 만들 수 있는 것과 같이, 하나의 도커 이미지로 여러 개의 도커 컨테이너를 만들 수 있다.
또한, 기존의 도넛 레시피를 수정하게 되어도, 이미 기존 레시피로 만들어진 도넛에는 영향이 없듯이, 이처럼 도커 이미지를 변경해도 이미 실행 중인 도커 컨테이너에는 영향을 주지 않는다.