Docker 이미지, Docker Compose, Kubernetes 개념 정리
1. Docker 이미지와 컨테이너의 차이
Docker를 처음 접하면 이미지와 컨테이너의 차이가 헷갈릴 수 있다. 두 개념을 간단히 설명하면, Docker 이미지는 컨테이너를 만들기 위한 설계도이고, 컨테이너는 이미지를 바탕으로 실제 실행된 인스턴스이다.
Docker 이미지란?
Docker 이미지는 애플리케이션을 실행하는 데 필요한 파일들을 하나로 묶어놓은 패키지이다. 이미지에는 다음과 같은 내용이 포함될 수 있다.
- 운영체제의 기본 환경
- 애플리케이션 실행 파일
- 라이브러리와 패키지
- 환경 설정
- 애플리케이션 실행 명령어
예를 들어 Python으로 만든 웹 애플리케이션을 실행하려면 Python 실행 환경, 필요한 라이브러리, 소스 코드 등이 필요하다. Docker 이미지는 이러한 요소를 하나의 패키지로 저장한다.
이미지는 일반적으로 Dockerfile을 이용해 생성한다.
FROM python:3.12
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
위 Dockerfile을 빌드하면 애플리케이션 실행에 필요한 환경이 포함된 Docker 이미지가 만들어진다.
docker build -t my-python-app .
Docker 컨테이너란?
Docker 컨테이너는 Docker 이미지를 실제로 실행한 상태이다.
docker run my-python-app
위 명령어를 실행하면 my-python-app 이미지를 기반으로 컨테이너가 생성되고, 컨테이너 내부에서 애플리케이션이 실행된다.
하나의 이미지로 여러 개의 컨테이너를 만들 수도 있다.
Docker 이미지
├── 컨테이너 1
├── 컨테이너 2
└── 컨테이너 3
각 컨테이너는 동일한 이미지로 생성되더라도 서로 독립적으로 실행된다.
이미지와 컨테이너의 관계
이미지와 컨테이너의 관계는 프로그램 설치 파일과 실행 중인 프로그램의 관계로 생각할 수 있다.
구분Docker 이미지Docker 컨테이너
| 의미 | 컨테이너를 만들기 위한 설계도 | 이미지를 기반으로 실행된 환경 |
| 상태 | 정적인 파일 | 실행 가능한 프로세스 |
| 역할 | 실행 환경과 애플리케이션 저장 | 실제 애플리케이션 실행 |
| 비유 | 프로그램 설치 파일 | 실행 중인 프로그램 |
| 주요 명령어 | docker build, docker pull | docker run, docker stop |
즉, 이미지만 가지고 있다고 해서 애플리케이션이 실행되는 것은 아니다. 이미지를 바탕으로 컨테이너를 생성하고 실행해야 실제 서비스가 동작한다.
2. Docker Compose는 어떤 상황에서 유용한가?
Docker Compose는 여러 개의 Docker 컨테이너를 하나의 설정 파일로 정의하고 함께 실행할 수 있도록 도와주는 도구이다.
간단한 애플리케이션은 컨테이너 하나만으로 실행할 수 있지만, 실제 서비스에서는 여러 컨테이너가 함께 필요한 경우가 많다.
예를 들어 웹 서비스를 구성할 때 다음과 같은 요소가 필요할 수 있다.
웹 애플리케이션 컨테이너
↓
데이터베이스 컨테이너
↓
Redis 컨테이너
각 컨테이너를 docker run 명령어로 하나씩 실행하려면 포트, 네트워크, 환경변수, 볼륨 등을 매번 직접 설정해야 한다.
docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
-p 3306:3306 \
mysql:8
docker run -d --name redis \
-p 6379:6379 \
redis
docker run -d --name backend \
-p 8080:8080 \
my-backend
컨테이너가 많아질수록 명령어가 길어지고 관리하기 어려워진다. Docker Compose를 사용하면 이러한 설정을 compose.yaml 파일 하나에 작성할 수 있다.
services:
backend:
build: .
ports:
- "8080:8080"
depends_on:
- database
- redis
database:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: "1234"
ports:
- "3306:3306"
redis:
image: redis
ports:
- "6379:6379"
설정 파일을 작성한 후 다음 명령어를 실행하면 여러 컨테이너를 한 번에 실행할 수 있다.
docker compose up -d
실행 중인 컨테이너들을 한 번에 종료하려면 다음 명령어를 사용한다.
docker compose down
Docker Compose가 유용한 상황
Docker Compose는 다음과 같은 상황에서 유용하다.
첫째, 웹 서버, 데이터베이스, 캐시 서버처럼 여러 컨테이너를 함께 실행해야 할 때 유용하다.
둘째, 개발자마다 동일한 개발 환경을 구성해야 할 때 유용하다. 프로젝트의 Compose 파일을 공유하면 팀원들이 동일한 컨테이너 구성으로 개발 환경을 실행할 수 있다.
셋째, 복잡한 docker run 명령어를 반복해서 입력하지 않아도 된다. 포트, 볼륨, 네트워크, 환경변수 등의 설정을 파일로 관리할 수 있다.
넷째, 로컬 개발 및 테스트 환경을 빠르게 구성하고 제거할 수 있다.
Dockerfile과 Docker Compose의 차이
Dockerfile과 Docker Compose는 경쟁 관계가 아니라 서로 다른 역할을 담당한다.
Dockerfile은 하나의 Docker 이미지를 어떻게 만들 것인지 정의하는 파일이다. 반면, Docker Compose는 여러 컨테이너를 어떤 구성으로 실행할 것인지 정의하는 파일이다.
구분DockerfileDocker Compose
| 목적 | Docker 이미지 생성 | 여러 컨테이너 실행 및 관리 |
| 주요 내용 | 파일 복사, 패키지 설치, 실행 명령어 | 서비스, 포트, 환경변수, 볼륨, 네트워크 |
| 주요 명령어 | docker build | docker compose up |
| 관리 대상 | 이미지 | 컨테이너 구성 |
| 대표 파일명 | Dockerfile | compose.yaml |
일반적으로 Dockerfile과 Docker Compose는 함께 사용된다.
Dockerfile
↓
애플리케이션 이미지 생성
↓
Docker Compose
↓
애플리케이션, DB, Redis 컨테이너 함께 실행
Compose 파일의 build: . 설정은 현재 위치의 Dockerfile을 이용해 이미지를 생성하라는 의미이다.
3. Kubernetes의 기본 개념
Kubernetes는 여러 서버에서 실행되는 수많은 컨테이너를 자동으로 배포하고 관리하기 위한 컨테이너 오케스트레이션 플랫폼이다. 줄여서 K8s라고 부르기도 한다.
컨테이너 오케스트레이션은 여러 컨테이너의 배포, 확장, 복구, 네트워크 연결 등을 자동으로 관리하는 것을 의미한다.
Docker만 사용해도 컨테이너를 실행할 수 있지만, 운영 환경에서 컨테이너가 많아지면 다음과 같은 문제가 발생할 수 있다.
- 컨테이너가 종료되었을 때 누가 다시 실행할 것인가?
- 사용자가 증가하면 컨테이너 수를 어떻게 늘릴 것인가?
- 여러 서버 중 어느 서버에 컨테이너를 배치할 것인가?
- 업데이트할 때 서비스를 중단하지 않고 배포할 수 있는가?
- 여러 컨테이너에 사용자의 요청을 어떻게 분산할 것인가?
Kubernetes는 이러한 문제를 자동으로 처리한다.
Kubernetes의 주요 기능
1. 자동 배포
Kubernetes는 사용자가 작성한 설정에 따라 컨테이너를 여러 서버에 자동으로 배치한다.
2. 자동 복구
실행 중인 컨테이너에 문제가 발생하면 해당 컨테이너를 종료하고 새로운 컨테이너를 자동으로 생성한다. 서버에 장애가 발생한 경우에도 정상 서버에서 컨테이너를 다시 실행할 수 있다.
3. 자동 확장
사용자 요청이나 CPU 사용량이 증가하면 컨테이너 수를 늘리고, 사용량이 줄어들면 컨테이너 수를 줄일 수 있다.
사용량이 적을 때
컨테이너 1개
사용량이 많을 때
컨테이너 1
컨테이너 2
컨테이너 3
4. 로드 밸런싱
여러 컨테이너가 실행 중일 때 사용자의 요청이 특정 컨테이너에만 집중되지 않도록 요청을 분산한다.
5. 무중단 배포
기존 컨테이너를 한 번에 종료하지 않고 새로운 버전의 컨테이너를 순차적으로 실행한다. 이를 통해 서비스 중단을 최소화하면서 새로운 버전을 배포할 수 있다.
Kubernetes의 기본 구성요소
Kubernetes를 이해할 때 자주 등장하는 기본 개념은 다음과 같다.
Cluster
Kubernetes가 관리하는 전체 서버 집합이다.
Node
클러스터에 포함된 개별 서버 또는 가상머신이다. 실제 컨테이너가 실행되는 작업 공간이라고 볼 수 있다.
Pod
Kubernetes에서 컨테이너를 실행하는 가장 작은 배포 단위이다. 일반적으로 하나의 Pod 안에는 하나의 주요 컨테이너가 들어간다.
Kubernetes Cluster
├── Node 1
│ ├── Pod 1
│ └── Pod 2
│
└── Node 2
├── Pod 3
└── Pod 4
Deployment
Pod를 몇 개 실행할지, 어떤 컨테이너 이미지를 사용할지 등을 정의한다.
예를 들어 다음과 같이 설정할 수 있다.
웹 애플리케이션 Pod를 항상 3개 유지한다.
Pod 하나가 비정상 종료되어 2개만 남으면 Kubernetes가 새로운 Pod를 생성하여 다시 3개를 유지한다.
Service
Pod에 접근할 수 있는 고정된 네트워크 주소를 제공하고, 여러 Pod로 요청을 분산한다.
Pod는 삭제되고 다시 생성될 때 주소가 바뀔 수 있다. Service는 변경되는 Pod를 대신하여 안정적인 접근 지점을 제공한다.
4. Kubernetes와 Docker의 관계
Docker와 Kubernetes는 서로 대체하는 기술이라기보다 담당하는 범위가 다르다.
Docker는 애플리케이션을 이미지로 만들고 컨테이너 형태로 실행하는 데 사용된다. Kubernetes는 이렇게 만들어진 컨테이너를 여러 서버에서 배포하고 관리하는 데 사용된다.
Dockerfile 작성
↓
Docker 이미지 생성
↓
컨테이너 실행 가능
↓
Kubernetes가 여러 컨테이너를 배포하고 관리
역할을 비교하면 다음과 같다.
구분DockerKubernetes
| 주요 목적 | 이미지 생성 및 컨테이너 실행 | 컨테이너 배포 및 운영 자동화 |
| 관리 범위 | 주로 개별 서버의 컨테이너 | 여러 서버와 다수의 컨테이너 |
| 장애 복구 | 사용자가 직접 처리할 수 있음 | 컨테이너를 자동으로 재생성 |
| 확장 | 사용자가 직접 컨테이너 추가 | 설정이나 사용량에 따라 자동 확장 가능 |
| 로드 밸런싱 | 별도 설정 필요 | Service 등을 통해 지원 |
| 적합한 환경 | 개발, 테스트, 소규모 서비스 | 대규모 운영 및 분산 환경 |
참고로 Kubernetes가 Docker 자체를 반드시 요구하는 것은 아니다. Kubernetes는 컨테이너 실행을 위해 컨테이너 런타임을 사용하며, 대표적으로 containerd나 CRI-O 등이 사용된다. 다만 Docker로 만든 이미지는 표준 컨테이너 이미지 형식을 사용하기 때문에 Kubernetes 환경에서도 사용할 수 있다.
5. Docker Compose와 Kubernetes의 차이
Docker Compose와 Kubernetes 모두 여러 컨테이너를 관리할 수 있지만 사용 목적과 규모에 차이가 있다.
Docker Compose는 주로 하나의 컴퓨터에서 여러 컨테이너를 실행하는 개발 및 테스트 환경에 적합하다. 반면 Kubernetes는 여러 서버에서 다수의 컨테이너를 안정적으로 운영해야 하는 환경에 적합하다.
구분Docker ComposeKubernetes
| 주요 용도 | 로컬 개발 및 테스트 | 실제 서비스 운영 |
| 관리 범위 | 주로 하나의 서버 | 여러 서버로 구성된 클러스터 |
| 설정 난이도 | 비교적 간단함 | 상대적으로 복잡함 |
| 자동 복구 | 제한적 | 지원 |
| 자동 확장 | 기본적으로 제공하지 않음 | 지원 |
| 무중단 배포 | 제한적 | 지원 |
| 적합한 규모 | 소규모 구성 | 중대규모 분산 환경 |
예를 들어 개인 프로젝트에서 백엔드, MySQL, Redis를 함께 실행한다면 Docker Compose만으로도 충분할 수 있다.
반면 사용자가 많은 실제 서비스를 여러 서버에서 운영하고, 장애 복구와 자동 확장이 필요하다면 Kubernetes를 사용하는 것이 적합하다.
정리
Docker 이미지는 애플리케이션 실행 환경을 저장한 설계도이고, Docker 컨테이너는 이미지를 바탕으로 실제 실행된 환경이다.
Dockerfile은 Docker 이미지를 만드는 방법을 정의하며, Docker Compose는 여러 컨테이너의 실행 구성을 정의한다.
Kubernetes는 다수의 컨테이너를 여러 서버에 배포하고, 장애 복구, 확장, 로드 밸런싱, 무중단 배포 등을 자동으로 수행하는 플랫폼이다.
전체적인 관계를 정리하면 다음과 같다.
Dockerfile
↓
Docker 이미지 생성
↓
Docker 컨테이너 실행
↓
Docker Compose
여러 컨테이너를 간편하게 구성
또는
Docker 이미지
↓
Kubernetes
여러 서버에서 컨테이너를 자동 배포·확장·복구
따라서 Docker는 컨테이너를 만들고 실행하기 위한 기술이고, Kubernetes는 만들어진 컨테이너를 대규모 환경에서 효율적으로 운영하기 위한 기술이라고 정리할 수 있다.
'스프린트미션' 카테고리의 다른 글
| 위클리 페이퍼 #16 (0) | 2026.06.29 |
|---|---|
| 위클리 페이퍼 #15 (0) | 2026.06.21 |
| 위클리 페이퍼 #12 (0) | 2026.04.27 |
| 위클리 페이퍼 #11 (0) | 2026.04.20 |
| 위클리 페이퍼 #10 (1) | 2026.04.13 |