Q1. Docker 이미지와 컨테이너의 차이를 설명해보세요.
A1. 이미지는 app 실행에 필요한 환경을 모아놓은 것(읽기)이고, 컨테이너는 이미지를 기반으로 실행된 프로세스(쓰기)이다.
Q2. Docker Compose는 어떤 상황에서 유용하며, 일반 Dockerfile과 어떤 차이가 있나요?
A2. 컴포즈는 여러 컨테이너로 구성된 앱을 한번에 실행하기에 유용하다. 도커파일은 단일 이미지, 컴포즈는 다중 컨테이너를 담당한다.
Q3. Kubernetes의 기본 개념은 무엇이며, Docker와는 어떤 관계가 있나요?
A3. 다중 컨테이너를 관리하는 시스템이다. 쿠버네티스로 여러 도커에 동시다발적으로 명령을 내릴 수 있다. 도커 컴포즈보다 대규모 처리에 좋다.
Dockerfile에 정의된 명령어 하나하나가 레이어 한 층으로 쌓이는 구조# 베이스 이미지 선택 (Node.js 18 버전 환경)
FROM node:18-alpine
# 작업 디렉토리 설정
WORKDIR /usr/src/app
# package.json 파일들을 작업 디렉토리로 복사
COPY package*.json ./
# 의존성 라이브러리 설치
RUN npm install
# 소스코드 전체를 작업 디렉토리로 복사
COPY . .
# 컨테이너 외부로 노출할 포트 설정
EXPOSE 3000
# 컨테이너 시작 시 실행할 명령어
CMD [ "node", "server.js" ]
| 구분 | 이미지 (Image) | 컨테이너 (Container) |
|---|---|---|
| 핵심 | 실행 환경을 담은 읽기 전용 템플릿 | 이미지의 실행 가능한 격리된 인스턴스 |
| 구조 | 여러 개의 읽기 전용 레이어 스택 | 이미지 레이어 + 쓰기 가능 레이어 |
| 상태 | 변하지 않음 (Immutable) | 상태 변경 가능 (Stateful) |
| 관계 | 컨테이너의 설계도 | 설계도로 지은 집 |
FROM, RUN, COPY, CMD 등의 명령어를 순서대로 실행하여 이미지를 생성docker-compose.yml YAML 파일을 사용하여 서비스, 네트워크, 볼륨 등을 한번에 설정| 구분 | Dockerfile | Docker Compose |
|---|---|---|
| 목적 | 단일 이미지 빌드(Build) | 다중 컨테이너 실행(Run) |
| 결과물 | Docker 이미지 | 실행 중인 컨테이너 그룹 |
| 사용 파일 | Dockerfile | docker-compose.yml |
| 주요 명령어 | docker build | docker-compose up |
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
| 도구 | Docker | Docker Compose | Kubernetes |
|---|---|---|---|
| 규모 | 단일 컨테이너 | 다중 컨테이너 (단일 호스트) | 다중 컨테이너 (다중 호스트 클러스터) |
| 주요 역할 | 컨테이너 생성 및 실행 | 로컬 개발 환경 구성 | 프로덕션 환경의 대규모 서비스 운영 |
| 핵심 | 컨테이너화 | 간편한 다중 서비스 정의 | 자동화, 스케일링, 고가용성 |
Docker 이미지란 컨테이너를 실행하기 위한 모든 요소가 포함된 정적인 템플릿입니다. 애플리케이션 코드, 라이브러리, 실행 환경, 의존성 등이 포함되어 있어, 어떤 환경에서도 동일하게 실행될 수 있도록 보장해줍니다.
반면, 컨테이너는 이 이미지를 기반으로 실제로 실행된 인스턴스로, 격리된 공간에서 동작하는 일종의 경량 가상 환경입니다. 이미지는 변경되지 않는 반면, 컨테이너는 실행 중에 상태가 바뀔 수 있고, 메모리나 파일시스템에 변화가 발생할 수 있습니다.
즉, 이미지는 설계도이고, 컨테이너는 그 설계도를 바탕으로 실제로 동작하는 애플리케이션 인스턴스입니다.
Dockerfile은 하나의 컨테이너 이미지를 정의할 때 사용됩니다. 예를 들어, Python 웹 서버를 정의할 때 필요한 의존성과 실행 명령어를 Dockerfile에 작성합니다. 하지만 실제 애플리케이션은 하나의 서비스만으로 구성되지 않는 경우가 많습니다. 예를 들어, 웹 서버, 데이터베이스, 캐시 서버 등이 함께 작동해야 하는 경우가 있습니다.
이럴 때 Docker Compose를 사용하면 여러 개의 컨테이너를 하나의 yaml 파일에 정의하고 동시에 실행하고 관리할 수 있습니다. docker-compose.yml 파일을 통해 각 서비스 간의 네트워크 연결, 볼륨 공유, 의존성 순서 등을 설정할 수 있어 복잡한 멀티 컨테이너 환경을 효율적으로 구축할 수 있습니다.
결과적으로 Dockerfile은 컨테이너 하나의 정의에 집중하고, Docker Compose는 여러 컨테이너로 구성된 애플리케이션 전체를 관리하는 역할을 합니다.
Kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포하고, 확장하고, 복구하며, 운영하는 오픈소스 컨테이너 오케스트레이션 플랫폼입니다.
Docker는 개별 컨테이너를 만들고 실행하는 데 탁월하지만, 다수의 컨테이너가 존재하고 이들 간의 상호작용이 필요한 실제 운영 환경에서는 이를 수동으로 관리하기 어렵습니다. Kubernetes는 이 문제를 해결하기 위해 컨테이너들을 클러스터 단위로 관리하고, Pod라는 단위로 컨테이너들을 묶어 배포합니다.
Kubernetes는 컨테이너 상태를 모니터링하며, 장애가 발생했을 때 자동으로 재시작하거나 다른 노드에 재배치하는 기능도 제공합니다. 또한, 롤링 업데이트, 로드 밸런싱, 자동 확장과 같은 고급 기능도 지원합니다.
즉, Docker가 컨테이너 생성 도구라면, Kubernetes는 이 컨테이너들을 대규모로 운영하기 위한 관리 시스템이라고 볼 수 있습니다.