컨테이너

애플리케이션의 구성 요소(프론트엔드, API, DB 등)을 각각 격리된 프로세스로 실행하는 환경.

특징

  • 호스트의 어떤 환경에도 의존하지 않고, 필요한 라이브러리와 설정을 모두 포함한 독립된 환경으로 존재한다.
  • 서로 다른 컨테이너는 격리되어 있어서 하나가 망가져도 다른 컨테이너에 영향을 주지 않는다.

컨테이너 vs. VM

VM은 자체 커널, 드라이버, 프로그램을 갖춘 완전한 운영체제이기 때문에, 단일 애플리케이션을 분리하기 위해 VM을 사용하는 것은 오버헤드가 크다.

컨테이너는 실행에 필요한 모든 파일을 갖춘 고립된 프로세스이다. 여러 컨테이너를 실행하더라도 모두 동일한 커널을 공유하므로, 더 적은 인프라에서 많은 애플리케이션을 실행할 수 있다.

이미지

컨테이너를 실행하는 데 필요한 코드 + 라이브러리 + 설정 + OS 파일 시스템을 하나로 묶은 패키지

특징

  • 이미지는 불변이다. 이미지를 만든 이후에는 수정할 수 없고, 새 이미지를 만들거나 기존 이미지 위에 변경 사항을 추가하는 것만 가능하다.
  • 이미지는 여러 레이어로 구성된다. 각 레이어는 파일을 추가, 제거 혹은 수정하는 파일 시스템 변경 사항 집합을 나타낸다.
  • 하나의 이미지에서 여러 개의 컨테이너를 띄울 수 있다.

이미지 레이어

이미지의 각 레이어에는 추가, 삭제 또는 수정과 같은 파일 시스템 변경 사항이 포함된다. 다음은 이미지의 예시이다.

image.png
  • 예시
    1. apt와 같은 기본 명령과 패키지 관리자를 추가한다.
    2. Python 런타임과 pip를 설치한다.
    3. 애플리케이션의 requirements.txt 파일을 복사한다.
    4. 해당 애플리케이션의 특정 종속성을 설치한다.
    5. 애플리케이션의 실제 소스 코드를 복사한다.

레이어를 사용하면 기본 레이어를 재사용하여 다른 사람의 이미지를 확장할 수 있고, 애플리케이션에 필요한 데이터만 추가할 수 있다.

컨테이너 내부에서 새 이미지 레이어를 수동으로 생성할 수도 있지만, 대부분 Dockerfile을 이용해서 자동화 하여 처리한다…