운영체계를 기반으로 만들어진 대부분의 software는 그 실행을 위하여 OS와 Software가 사용하는 동적 library에 대하여 의존성을 갖는다. software A와 B가 동일한 library를 사용하지만 서로 다른 버전을 필요로 하는 경우라던지 두 software 운영 체제가 다를 경우 등 다양한 경우에서 문제가 발생하는데, 이러한 문제점을 효율적으로 해결한 것이 container이다.
container는 개별 software의 실행에 필요한 살행 환경을 독립적으로 운용할 수 있도록 기반 환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술이다. Container는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 매커니즘을 제공한다.
가상 환경에 익숙하면 컨테이너를 가상머신(VM)에 비교하여 생각하면 이해하기 쉽다. 호스트 운영체제에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스하는 linux, windows등의 게스트 운영체제를 의미한다. Container는 VM과 마찬가지로 애플리케이션을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 마련해 준다.
가상 머신은 하드웨어 스택을 가상화한다. 컨테이너느 이와 달리 운영체제 수준에서 가상화를 실시 하여 다수의 컨테이너를 OS 커널에서 직접 구동한다. 컨테이너는 훨씬 가볍고 운영체제 커널을 공유하며, 시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 적게 차지한다.
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것. 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 남아있다. commit 명령어를 통해서 이미지를 남길 수 있다.