
정의
- 컨테이너는 운영 체제 가상화의 한 형태이다.
- 컨테이너는 배포용 애플리케이션을 가상으로 패키지하고 격리할 수 있는 소프트웨어 유형이다.
- 서비스를 라이브러리처럼 다운받아 실행하는 것이다.
- 컨테이너는 표준화된 방식으로 애플리케이션 코드와 해당 종속성을 패키징하는 실행 가능한 경량 소프트웨어 단위이다. 이 패키징을 사용하면 애플리케이션이 이동 가능하고 여러 위치에서 실행될 수 있다.
- 애플리케이션의 코드와 종속성을 함께 패키징하여 애플리케이션이 모든 컴퓨팅 환경에서 안정적으로 실행되도록 한다.
- 컨테이너는 가상 머신 없이 OS 커널에 대한 액세스를 공유한다. 소규모 마이크로서비스, 대규모 애플리케이션 또는 경량 컨테이너 OS를 실행하는 데 사용될 수 있다.
- 컨테이너는 가상 머신과 달리 모든 인스턴스에 게스트 OS를 포함할 필요가 없고, 대신 호스트 OS의 기능과 리소스를 간단히 활용할 수 있기 때문에 작고 빠르며 이식성이 뛰어난다.
- 컨테이너 기술은 시스템 컨테이너화와 애플리케이션 컨테이너화로 나뉜다. 두 스타일 모두 기본 인프라에서 애플리케이션 코드를 추상화하여 버전 관리를 단순화하고 다양한 배포 환경에서 이식을 가능하게 한다.
- 애플리케이션 컨테이너
- Docker가 대표적으로, OS에서 실행될 애플리케이션의 파일, 종속성 및 라이브러리를 캡슐화한다.
- 사용자는 여러 독립 애플리케이션 또는 단일 애플리케이션을 구성하는 여러 서비스에 대해 별도의 컨테이너를 만들고 실행할 수 있다.
- 시스템 컨테이너
- LXC가 대표적으로, 기술적으로 애플리케이션 컨테이너 및 VM과 유사하다.
- OS가 VM에서 캡슐화되어 실행되는 방식과 마찬가지로 OS를 실행할 수 있다.
- 단, 시스템 컨테이너는 시스템의 하드웨어를 에뮬레이트하지는 않으며, 대신 애플리케이션 컨테이너와 유사하게 작동한다.
- 사용자는 다양한 라이브러리, 언어 및 시스템 데이터베이스를 설치할 수 있다.
주요 특징 및 개념
- 가상화(Virtualization)
- 컨테이너는 OS 수준의 가상화를 사용하여 애플리케이션을 격리된 환경에서 실행한다.
- 이는 호스트 시스템에 설치된 OS의 커널을 공유하면서도 각각의 컨테이너가 자체 파일 시스템과 프로세스 공간을 보유할 수 있도록 한다.
- 이식성(Portability)
- 컨테이너는 의존성과 환경 설정을 포함하여 애플리케이션을 패키지화한다.
- 이로써 애플리케이션은 어디에서든 실행될 수 있으며, 개발 환경에서 프로덕션 환경으로 쉽게 전이할 수 있다.
- 경량(Lightweight)
- 컨테이너는 가상 머신보다 경량이며 빠르게 시작되고 중지된다.
- 이는 가상 머신과 달리 각 컨테이너가 고유한 OS를 실행하지 않기 때문이다.
- 이미지(Image)
- 컨테이너는 이미지로 패키지된다. 이미지는 실행 가능한 애플리케이션을 만들기 위해 필요한 모든 것을 포함하고 있다
- Docker 이미지의 경우, 컨테이너 실행을 위한 파일 시스템, 코드, 라이브러리 및 종속성 등이 포함된다.
- 격리(Isolation)
- 각 컨테이너는 다른 컨테이너와 격리되어 하나의 컨테이너에서 발생한 문제가 다른 컨테이너에 영향을 미치지 않는다
- 이는 응용 프로그램 간의 충돌을 방지하고 보안을 강화한다
작동 방식(Docker 기준)
- 이미지 빌드
- 도커 파일 작성
- 개발자는 컨테이너를 어떻게 빌드할지 정의하는 도커 파일을 작성한다.
- 도커 파일은 베이스 이미지, 애플리케이션 코드, 의존성, 환경 설정 등을 정의한다.
- 도커 이미지 빌드
- 도커 파일을 사용하여 도커 이미지를 빌드한다.
- 이미지는 여러 계층(layer)으로 구성되며, 각 계층은 도커 파일의 각 단계에 해당한다.