1. Container
- 컨테이너란 애플리케이션을 실행할 수 있는 컴퓨팅 리소스, 작업 등을 하나로 묶어서 가상화 한 방식이다.
- OS 전체가 아닌 애플리케이션 실행에 필요한 최소한의 구성만 포함하여 가볍다.
- 격리된 환경에서 실행되어 서로 다른 컨테이너에 영향을 주지 않는다.
- 소스 코드과 실행 환경을 함께 컨테이너 안에 들어있어 어느 환경에서 실행해도 동일한 결과를 도출한다.
- 기존의 VM 수준의 가상화 방식은 guest OS를 포함한 독립적인 환경이 필요해 리소스 사용량이 매우 크고 부팅 시간이 느려 무겁다는 한계가 있다.
- 컨테이너 수준의 가상화 방식은 host OS를 공유하며 컨테이너 엔진을 통해서 애플리케이션 실행에 필요한 리소스와 프로세스만 격리하므로 가볍고 빠르다.

- Container Engine은 API, CLI 도구를 제공하고 이미지를 관리하는 도구이다.
(예: Docker Engine, Podman)
- Container Runtime은 만들어진 docker 이미지를 이용해서 실제 컨테이너를 실행하는 도구이다.
(예: runC, containerd, cri-o)
2. Docker
- 애플리케이션과 실행 환경을 컨테이너로 관리/운영하는 오픈소스 가상화 플랫폼이다.

- docker의 동작 과정은 Dockerfile 만들기 → Docker image 만들기 → 실행의 3가지 과정을 거친다.
- Dockerfile: 도커 이미지를 생성하기 위한 설정 파일이다. 쉽게 말해서 컨테이너를 어떻게 만들지 적어놓은 설계도이다. (예: “OS는 우분투로 설치해줘", "내 프로그램 복사해줘" 등)
- Docker Image: Dockerfile을 바탕으로 만든 실행 가능한 패키지이다. 컨테이너 실행에 필요한 파일과 설정 값 등을 모두 포함하고 있다.
- Docker Container: 이미지를 실행시킨 실제 상태이다. 우리가 실제로 사용하는 프로그램이 돌아가는 격리된 공간이다.
- 완전 쉽게 말해서 dockerfile은 자동화된 레시피(레시피만 있으면 알아서 image를 만듦), docker image는 밀키트, 프로그램 실행 결과가 요리라고 할 수 있겠다.
- 이 밀키트(Image)만 있으면 어느 주방(서버)에 가더라도 가스불(Docker 엔진)만 켜면 똑같은 맛(Docker Container)이 난다.
