Docker와 Kubernetes 기본 개념

hoho·2025년 3월 26일

클라우드 & 인프라

목록 보기
1/4

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. 운영 단위: 쿠버네티스는 "컨테이너"가 아니라 "파드"를 기준으로 스케일링, 복제, 롤아웃, 롤백 등을 한다.

0개의 댓글