
Docker: 컨테이너화의 기초
Docker란 무엇인가?
- Docker는 애플리케이션을 표준화된 유닛(컨테이너)으로 패키징하고 배포할 수 있게 해주는 플랫폼이다.
- 컨테이너는 애플리케이션과 그 종속성을 함께 포장하여 어느 환경에서든 일관되게 실행될 수 있게 한다.
Docker의 주요 개념
1. 도커 이미지 (Docker Image)
- 애플리케이션을 실행하는 데 필요한 모든 파일과 설정을 포함하는 불변의 템플릿
- Dockerfile을 통해 생성되며, 레이어 기반 구조를 가짐
- Docker Hub 같은 레지스트리에서 공유 가능
2. 도커 컨테이너 (Docker Container)
- 도커 이미지의 실행 가능한 인스턴스
- 격리된 환경에서 애플리케이션 실행
- 가볍고 빠르며 시작/중지가 신속함
3. Dockerfile
- 도커 이미지를 빌드하기 위한 텍스트 기반 스크립트
- 베이스 이미지, 애플리케이션 코드, 종속성, 실행 명령 등 정의
Docker 사용의 주요 이점
- 일관된 개발 및 프로덕션 환경
- 높은 이식성
- 리소스 효율성
- 빠른 배포 및 확장
Kubernetes: 컨테이너 오케스트레이션
Kubernetes란 무엇인가?
Kubernetes(K8s)는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 컨테이너 오케스트레이션 플랫폼
Kubernetes의 핵심 구성 요소
1. 파드 (Pod)
- Kubernetes의 가장 작은 배포 단위
- 하나 이상의 컨테이너 그룹
- 공유 네트워크 및 스토리지 자원
2. 클러스터 (Cluster)
- 컨테이너화된 애플리케이션을 실행하는 노드들의 집합
- 최소 하나의 마스터 노드와 워커 노드로 구성
3. 디플로이먼트 (Deployment)
- 포드의 상태와 복제본 수를 선언적으로 관리
- 롤링 업데이트 및 롤백 지원
4. 서비스 (Service)
- 포드 집합에 대한 네트워크 추상화
- 로드 밸런싱 및 서비스 디스커버리 제공
Kubernetes 사용의 주요 이점
- 자동 스케일링
- 자가 치유 기능
- 선언적 구성 관리
- 롤링 업데이트 및 롤백
- 복잡한 분산 시스템 관리 간소화
Docker와 Kubernetes의 통합
- Docker는 컨테이너를 생성하고, Kubernetes는 이러한 컨테이너를 대규모로 관리한다.
- 두 기술은 서로 보완적이다.
컨테이너(Container) 와 파드(Pod)
컨테이너와 파드가 개념적으로 헷갈려 한번 더 정리해보았다.
- 컨테이너는 기술(애플리케이션 실행 단위)
- 파드는 쿠버네티스의 추상화(컨테이너 관리 단위)
| 구분 | 컨테이너 (Container) | 파드 (Pod) |
|---|
| 정의 | 애플리케이션 실행 단위 (실제 실행체) | 쿠버네티스에서 컨테이너를 묶어 관리하는 단위 |
| 실행 위치 | Docker, Containerd 등 컨테이너 런타임에서 사용됨 | Kubernetes에서 사용됨 |
| 포함 관계 | 독립적인 실행 단위 | 하나 이상의 컨테이너를 포함 (보통 1개) |
| 관리 대상 | Docker나 containerd가 관리 | 쿠버네티스가 Pod 단위로 관리 |
| 목적 | 앱 실행 자체에 집중 | 쿠버네티스 관리 목적 (배포, 스케일링, 롤백 등) |
- 컨테이너는 Docker 나 containerd 같은 런타임이 실제로 실행한다.
- 쿠버네티스는 그 컨테이너들을 직접 다루지 않고, Pod 라는 단위로 포장해서 다룬다.
- 그래서 쿠버네티스에서 무언가 배포, 삭제, 스케일링할 때는 "파드" 단위를 기준으로 한다.
<그림>
Pod
└── Container A (예: 웹 서버)
└── Container B (예: 로그 수집기, 사이드카)
- 대부분 파드 안에는 컨테이너 하나만 들어 있다.
- 하지만 필요하면 여러 개의 컨테이너를 같은 파드에 넣을 수 있다.
- 예: 메인 앱 + 로그 사이드카, 메인 앱 + 캐시 리프레셔 등
<예시>
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: web
image: nginx
위 파드는 실제로 nginx 컨테이너를 실행하지만, 사용자는 컨테이너가 아니라 Pod my-app을 배포함
왜 굳이 "파드"가 필요할까?
1. 네트워크 공유: 파드 안의 컨테이너는 같은 IP 주소, 같은 localhost를 공유한다.
2. 볼륨 공유: 파드 안의 컨테이너끼리 공유 디스크 사용 가능
3. 운영 단위: 쿠버네티스는 "컨테이너"가 아니라 "파드"를 기준으로 스케일링, 복제, 롤아웃, 롤백 등을 한다.