container

컨테이너 특징

container vs virtual machine

container

컨테이너는 애플리케이션과 그 실행에 필요한 모든 리소스(라이브러리, 종속성 등)를 하나의 독립된 환경으로 패키징해 실행하는 기술이다

이미지(패키징된 애플리케이션 및 관련 리소스)를 실행할 호스트 이름, IP주소, 디스크 드라이브, 파일 시스템 등을 갖춘 가상의 컴퓨터와 같다

어디서든 일관된 방식으로 실행할 수 있게 만들며 컨테이너 간 서로 독립적인 환경을 갖지만 컨테이너가 실행되는 실제 물리적 컴퓨터의 자원(CPU, 메모리, 운영체제)을 공유한다

컨테이너 특징

self-contained

컨테이너는 애플리케이션 실행에 필요한 모든 것(애플리케이션 코드, 라이브러리, 설정 파일 등)을 하나의 패키지로 포함하고 있다

또한 호스트 시스템 설정(환경 변수, 특정 라이브러리 버전 등)에 의존하지 않아서 동일한 컨테이너 이미지로 로컬, 클라우드, 온프레미스 등의 호스트에서 동일하게 실행할 수 있다

컨테이너 이미지를 빌드할 때 필요한 모든 의존성을 다운로드하고 패키징한다 -> 실행 시 추가 설정이나 설치 과정이 필요하지 않다

isolated, independent

컨테이너는 자신만의 파일 시스템, 네트워크 인터페이스, 디스크 드라이브, 호스트 이름 등을 가지며 호스트 시스템에서 독립된 프로세스로 실행된다

또한 컨테이너 간에 각기 독립된 실행 환경을 가짐으로써 다음과 같은 이점을 가진다 (호스트 및 다른 컨테이너와 독립적으로 동작)

문제 격리: 한 컨테이너에서 발생한 오류가 다른 컨테이너나 호스트 시스템에 영향을 미치지 않는다

호스트 격리: 호스트 OS 커널을 공유하지만 사용자 공간은 독립적이므로 컨테이너 내부에서 특정 소프트웨어를 설치/수정해도 호스트 OS에 영향을 주지 않는다

멀티테넌시: 서로 다른 언어(런타임)와 환경을 가진 애플리케이션을 동일한 호스트에서 동시에 실행할 수 있다

의존성 관리: 각 컨테이너 별로 자체적인 의존성을 가지므로, 버전 충돌이나 종속성 문제를 피할 수 있다

테스트 용이: 컨테이너 별로 독립적으로 테스트를 진행할 수 있으며 문제 발생 시 특정 컴포넌트에서 원인을 쉽게 찾을 수 있다

독립적 배포: 업데이트가 필요한 경우 전체 시스템을 중단하지 않고 대상 컨테이너만 독립적으로 배포할 수 있다

유연성

보안

portable

write once, run anywhere

컨테이너는 이미지(애플리케이션과 모든 의존성을 포함한 집약체)라는 형태로 배포된다

도커 이미지는 OCI(Open Container Initiative)라는 표준을 따르며 다양한 OS 플랫폼에서 호환된다

컨테이너는 가상 머신처럼 OS 전체를 포함하지 않고 호스트 커널을 공유하기 때문에 호스트 OS와 호환되는 경우 어디서든(로컬, 클라우드, 온프레미스 등) 실행이 가능하다

또한 빌드, 테스트, 배포 과정에서 동일한 이미지를 사용해 환경 차이에 따른 오류를 방지할 수도 있다

container vs virtual machine

컨테이너와 가상 머신은 두 가지 목적을 달성해야 제 기능을 한다고 볼 수 있다

격리(isolation): 애플리케이션 간 서로 독립적인 환경에서 실행

밀집(density): 가능한 많은 수의 애플리케이션 실행 가능

컨테이너와 가상 머신 모두 격리성을 가진다

다만 컨테이너의 경우 여러 격리된 컨테이너들이 동일한 호스트의 자원을 공유하는 데에 반해, 가상 머신은 호스트 운영체제 위에 별도의 운영체제를 필요로 한다

각각의 가상 머신이 운영체제를 필요로 한다는 것은 아래와 같은 단점을 가지게 되고 컨테이너와 달리 밀집성을 가질 수 없다