도커의 "컨테이너"는 사전적으로 격리 가능한 공간을 의미합니다. 여기서는 도커를 통해 애플리케이션 코드와 프로세스를 격리하여 서비스하는 개념입니다.
도커를 통해 애플리케이션 코드와 프로세스를 격리한다는 것은 컨테이너라는 가상 환경을 생성하여 애플리케이션을 실행할 때, 해당 애플리케이션의 코드와 프로세스가 호스트 시스템 및 다른 컨테이너와 분리돼 독립적으로 실행되도록 하는 것을 의미합니다.
도커는 리눅스 컨테이너를 사용하여 이 격리를 구현합니다. 리눅스 컨테이너는 리눅스의 기능인 네임스페이스와 컨트롤 그룹(Cgroup) 등을 활용하여 프로세스 간의 격리를 제공합니다. 이를 통해 도커는 다음과 같은 격리를 실현합니다.
각 컨테이너는 독립된 파일 시스템을 가집니다. 컨테이너 내부의 파일 시스템 변경이 해당 컨테이너에만 영향을 미치며, 호스트 시스템 또는 다른 컨테이너에는 영향을 미치지 않습니다.
각 컨테이너는 자체 프로세스 공간을 가지며, 호스트 시스템이나 다른 컨테이너의 프로세스와 격리됩니다. 한 컨테이너의 프로세스가 다른 컨테이너에 영향을 미치지 않습니다.
도커는 각 컨테이너에 독립된 네트워크 인터페이스를 할당하여 컨테이너 간 또는 호스트 시스템과의 네트워크 통신을 격리합니다.
컨트롤 그룹을 사용하여 CPU, 메모리, 디스크 I/O 등의 자원을 각 컨테이너에 할당하고 관리함으로써 자원의 격리를 제공합니다.
이러한 격리를 통해 도커 컨테이너는 동일한 호스트 시스템에서 여러 애플리케이션을 실행하면서 각각의 컨테이너가 서로 영향을 주지 않도록 보장합니다. 또한, 배포 및 관리가 간편하며 이식성이 높아지는 장점을 제공합니다.
대부분의 개발자가 개발, 테스트, 배포, 운영의 컴퓨팅 환경(스토리지, 네트워크, 보안, 패치 등) 차이로 인한 시행착오 및 다양한 오류 해결에 너무 많은 시간을 쏟는 공통적인 문제를 겪고 있다. 바로 가변적 인프라 환경으로 인한 일관성 없는 환경 제공 때문이다.
컨테이너 서비스는 기존 환경과 다르게 애플리케이션 실행에 필요한 바이너리, 라이브러리 및 구성 파일 등을 패키지로 묶어 배포하는 방식으로 논리적 패키징 메커니즘을 제공한다.
애플리케이션이 가지고 있는 운영체제, 하드웨어(CPU, 메모리, 스토리지 등)에 대한 의존성 문제를 해결한 것이다. 따라서 어떤 환경에서든 컨테이너 기반의 애플리케이션을 개발하고 배포할 수 있다.