개발환경

컨테이너와 오케스트레이션: Docker와 Kubernetes 완벽 가이드

ZZJJing 2025. 5. 15. 21:52
반응형

■ Docker 기본 개념

Docker란 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하는 플랫폼이다.

이렇게 하면 환경에 상관없이 애플리케이션이 동일하게 실행될 수 있다.

Docker의 핵심 요소:

  • 이미지: 애플리케이션 실행에 필요한 모든 것을 포함한 패키지
  • 컨테이너: 이미지의 실행 가능한 인스턴스
  • Dockerfile: 이미지를 만들기 위한 명령어 집합
  • 레지스트리: 이미지를 저장하는 저장소 (Docker Hub 등)

자주 사용하는 Docker 명령어:

# 이미지 빌드
docker build -t 이미지명:태그 .

# 컨테이너 실행
docker run -d -p 8080:80 이미지명:태그

# 실행 중인 컨테이너 목록 확인
docker ps

# 컨테이너 중지
docker stop 컨테이너ID

# 이미지 목록 확인
docker images

이미지를 처음에 빌드할 때는 꽤 시간이 걸리지만, 이후에는 캐싱 덕분에 빠르게 빌드된다.

또한 레이어 구조로 되어있어 변경된 부분만 다시 빌드하면 된다.

Dockerfile 작성 예시

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

이 Dockerfile은 Node.js 애플리케이션을 위한 것이다.

먼저 의존성 파일만 복사해서 설치하고, 그 다음에 소스 코드를 복사한다.

이렇게 하면 소스 코드가 변경되어도 의존성 설치 과정은 캐시에서 사용할 수 있어 빌드 시간이 단축된다.

 Docker Compose!!

여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하기 위한 도구이다.

# docker-compose.yml
version: '3'
services:
  web:
    build: ./web
    ports:
      - "8080:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password

 

명령어:

# 시작
docker-compose up -d

# 중지
docker-compose down

Docker Compose는 개발 환경이나 CI 환경에서 특히 유용하다.

프로덕션 환경에서는 Kubernetes를 쓰는 경우가 많다.

 


■ Kubernetes 기본 개념

Kubernetes(K8s)는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오케스트레이션 시스템이다.

핵심 구성 요소:

  • Pod: 컨테이너의 실행 단위, 하나 이상의 컨테이너를 포함
  • Node: 물리적 또는 가상 머신, 여러 Pod를 실행
  • Cluster: 여러 Node의 집합
  • Deployment: Pod의 생성과 업데이트를 관리
  • Service: Pod 집합에 대한 단일 접근점 제공

주요 명령어:

# 클러스터 정보 확인
kubectl cluster-info

# 리소스 생성
kubectl apply -f config.yaml

# Pod 목록 확인
kubectl get pods

# 로그 확인
kubectl logs pod-name

# Pod 내 컨테이너에 명령 실행
kubectl exec -it pod-name -- /bin/bash

 Kubernetes YAML 파일 예시

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:1.0
        ports:
        - containerPort: 80
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

컨테이너화된 애플리케이션 배포 과정

1. 도커 이미지 준비

# 이미지 빌드
docker build -t my-app:1.0 .

# 레지스트리에 푸시
docker tag my-app:1.0 username/my-app:1.0
docker push username/my-app:1.0

2. Kubernetes에 배포

# Deployment 생성
kubectl apply -f deployment.yaml

# Service 생성
kubectl apply -f service.yaml

# 배포 상태 확인
kubectl get deployments
kubectl get services

3. 배포 업데이트

# 이미지 버전 업데이트
kubectl set image deployment/my-app my-app=username/my-app:1.1

# 롤백
kubectl rollout undo deployment/my-app

스케일링

# 수동 스케일링
kubectl scale deployment/my-app --replicas=5

# 자동 스케일링
kubectl autoscale deployment/my-app --min=2 --max=10 --cpu-percent=80

모니터링 및 로깅

Kubernetes 모니터링을 위한 도구:

  • Prometheus: 메트릭 수집 및 알림
  • Grafana: 시각화
  • ELK Stack: 로그 수집 및 분석

 

실무 TIP

  1. 네임스페이스 활용하기: 여러 환경이나 팀을 분리하기 위해 네임스페이스를 사용하자
  2. 리소스 제한 설정: CPU와 메모리 한계를 항상 설정하자
  3. 헬스 체크 구현: liveness와 readiness 프로브를 설정하자
  4. ConfigMap과 Secret 활용: 설정과 비밀 정보를 분리하자
  5. CI/CD 파이프라인 구축: 자동화된 배포 과정을 구축하자

Docker와 Kubernetes는 현대 애플리케이션 개발과 배포에 필수적인 도구이다.

Docker로 환경 일관성을 확보하고, Kubernetes로 확장성과 가용성을 높일 수 있다.

무엇보다 인프라를 코드로 관리할 수 있다는 점이 가장 큰 장점이라고 생각한다.

처음에는 개념과 명령어가 많아 어렵게 느껴질 수 있지만,

실제 프로젝트에 적용해보면 그 효율성을 체감할 수 있을 것이다.

728x90
반응형