2025년 11월 29일 토요일

도커, 컨테이너, 쿠버네티스 완벽 가이드

 

도커, 컨테이너, 쿠버네티스 완벽 가이드

1️⃣ 컨테이너란?

컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(라이브러리, 설정 파일, 의존성 등)을 하나의 패키지로 묶은 실행 환경입니다.

컨테이너의 핵심 개념

  • 격리성: 각 컨테이너는 독립적인 환경에서 실행되어 다른 컨테이너나 호스트 시스템에 영향을 주지 않습니다
  • 경량성: 가상 머신(VM)과 달리 운영체제를 공유하므로 매우 가볍고 빠릅니다
  • 이식성: "내 컴퓨터에서는 되는데..."라는 문제를 해결합니다. 어디서든 동일하게 실행됩니다

가상 머신 vs 컨테이너

  • 가상 머신: 하드웨어를 가상화하여 각각 완전한 OS를 실행 (무겁고 느림)
  • 컨테이너: OS 수준에서 가상화하여 커널을 공유 (가볍고 빠름)

2️⃣ 도커(Docker)란?

도커는 컨테이너를 쉽게 만들고, 배포하고, 실행할 수 있게 해주는 플랫폼입니다.

도커의 주요 구성 요소

📦 도커 이미지 (Docker Image)

  • 컨테이너를 만들기 위한 "설계도" 또는 "템플릿"
  • 읽기 전용이며, 레이어 구조로 되어 있어 효율적입니다
  • 예: Ubuntu 이미지, Node.js 이미지, MySQL 이미지 등

🏃 도커 컨테이너 (Docker Container)

  • 이미지를 실행한 "인스턴스"
  • 실제로 애플리케이션이 동작하는 환경
  • 하나의 이미지로 여러 개의 컨테이너를 만들 수 있습니다

📝 Dockerfile

  • 도커 이미지를 만들기 위한 스크립트 파일
  • 어떤 베이스 이미지를 사용할지, 어떤 파일을 복사할지, 어떤 명령을 실행할지 정의합니다
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

🗂️ 도커 레지스트리 (Docker Registry)

  • 도커 이미지를 저장하고 공유하는 저장소
  • Docker Hub: 공개 레지스트리 (GitHub와 비슷)
  • 비공개 레지스트리도 구축 가능합니다

도커 기본 명령어

# 이미지 다운로드
docker pull nginx

# 컨테이너 실행
docker run -d -p 80:80 nginx

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

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

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

# 컨테이너 로그 확인
docker logs [컨테이너ID]

도커의 장점

  • 환경 일관성: 개발, 테스트, 운영 환경이 동일합니다
  • 빠른 배포: 몇 초 만에 애플리케이션을 시작할 수 있습니다
  • 버전 관리: 이미지 태그로 버전을 관리합니다
  • 자원 효율성: 하나의 서버에서 수십, 수백 개의 컨테이너를 실행할 수 있습니다

3️⃣ 쿠버네티스(Kubernetes)란?

쿠버네티스(줄여서 K8s)는 컨테이너화된 애플리케이션을 자동으로 배포, 확장, 관리하는 컨테이너 오케스트레이션 플랫폼입니다.

왜 쿠버네티스가 필요한가?

도커로 컨테이너를 실행할 수 있지만, 다음과 같은 문제가 생깁니다:

  • 컨테이너가 100개, 1000개라면 어떻게 관리할까요?
  • 컨테이너가 죽으면 누가 다시 시작시킬까요?
  • 트래픽이 증가하면 자동으로 컨테이너를 늘릴 수 있을까요?
  • 여러 서버에 컨테이너를 어떻게 분산시킬까요?

쿠버네티스가 이 모든 것을 자동으로 해결합니다!

쿠버네티스 주요 개념

🎯 클러스터 (Cluster)

  • 쿠버네티스를 실행하는 서버들의 집합
  • 마스터 노드: 클러스터를 관리하는 제어 영역
  • 워커 노드: 실제로 컨테이너가 실행되는 노드

📦 파드 (Pod)

  • 쿠버네티스에서 배포할 수 있는 가장 작은 단위
  • 하나 이상의 컨테이너를 포함합니다
  • 같은 파드 내의 컨테이너들은 네트워크와 스토리지를 공유합니다

🔄 디플로이먼트 (Deployment)

  • 파드를 생성하고 관리하는 상위 개념
  • 원하는 상태를 선언하면, 쿠버네티스가 현재 상태를 원하는 상태로 맞춥니다
  • 롤링 업데이트: 무중단 배포를 지원합니다
  • 자동 복구: 파드가 죽으면 자동으로 재시작합니다
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3  # 파드를 3개 유지
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

🌐 서비스 (Service)

  • 파드들에 대한 네트워크 접근을 제공합니다
  • 파드는 죽었다 살아나면 IP가 바뀌는데, 서비스는 고정된 IP를 제공합니다
  • 로드 밸런싱: 여러 파드에 트래픽을 분산시킵니다

서비스 타입:

  • ClusterIP: 클러스터 내부에서만 접근 (기본값)
  • NodePort: 외부에서 노드의 특정 포트로 접근
  • LoadBalancer: 클라우드의 로드 밸런서를 자동으로 생성

📊 레플리카셋 (ReplicaSet)

  • 지정된 수의 파드를 항상 실행되도록 보장합니다
  • 보통 디플로이먼트를 통해 자동으로 관리됩니다

💾 볼륨 (Volume) & 퍼시스턴트 볼륨 (PV/PVC)

  • 컨테이너가 사라져도 데이터를 유지하기 위한 스토리지
  • PV (PersistentVolume): 관리자가 프로비저닝한 스토리지
  • PVC (PersistentVolumeClaim): 사용자가 요청하는 스토리지

⚙️ 컨피그맵 (ConfigMap) & 시크릿 (Secret)

  • ConfigMap: 설정 데이터를 저장 (예: 환경 변수, 설정 파일)
  • Secret: 민감한 데이터를 암호화하여 저장 (예: 비밀번호, API 키)

🔧 네임스페이스 (Namespace)

  • 클러스터 내에서 리소스를 논리적으로 분리합니다
  • 예: 개발, 테스트, 운영 환경을 네임스페이스로 분리

📍 인그레스 (Ingress)

  • HTTP/HTTPS 라우팅을 관리합니다
  • 도메인 기반, 경로 기반 라우팅을 지원합니다
  • SSL/TLS 인증서 관리도 가능합니다

쿠버네티스 기본 명령어

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

# 파드 목록 확인
kubectl get pods

# 디플로이먼트 생성
kubectl apply -f deployment.yaml

# 서비스 목록 확인
kubectl get services

# 파드 로그 확인
kubectl logs [파드이름]

# 파드 내부로 접속
kubectl exec -it [파드이름] -- /bin/bash

# 리소스 삭제
kubectl delete -f deployment.yaml

# 파드 스케일링
kubectl scale deployment nginx-deployment --replicas=5

쿠버네티스의 핵심 기능

🔄 자동 스케일링

  • HPA (Horizontal Pod Autoscaler): CPU/메모리 사용률에 따라 파드 수를 자동 조절
  • VPA (Vertical Pod Autoscaler): 파드의 리소스(CPU/메모리) 할당량을 자동 조절

🩺 자가 치유 (Self-healing)

  • 컨테이너가 실패하면 자동으로 재시작합니다
  • 응답하지 않는 컨테이너를 감지하고 교체합니다
  • Liveness Probe: 컨테이너가 살아있는지 확인
  • Readiness Probe: 컨테이너가 트래픽을 받을 준비가 되었는지 확인

🌊 롤링 업데이트 & 롤백

  • 무중단으로 새 버전을 배포합니다
  • 문제가 생기면 이전 버전으로 즉시 롤백할 수 있습니다

🔐 시크릿 & 구성 관리

  • 코드와 설정을 분리하여 관리합니다
  • 민감한 정보를 안전하게 저장합니다

🔗 세 가지의 관계

컨테이너 (개념)
   ↓
도커 (컨테이너를 만들고 실행하는 도구)
   ↓
쿠버네티스 (여러 컨테이너를 관리하고 오케스트레이션하는 플랫폼)

실제 사용 예시

  1. 개발자가 애플리케이션을 작성합니다
  2. Dockerfile을 작성하여 애플리케이션을 컨테이너화합니다
  3. 도커로 이미지를 빌드하고 레지스트리에 푸시합니다
  4. 쿠버네티스 매니페스트(YAML 파일)를 작성합니다
  5. kubectl로 쿠버네티스에 배포합니다
  6. 쿠버네티스가 자동으로 컨테이너를 실행, 관리, 스케일링합니다

📚 학습 로드맵

초급 단계

  1. 리눅스 기본 명령어 익히기
  2. 도커 설치 및 기본 명령어 학습
  3. 간단한 Dockerfile 작성 연습
  4. Docker Compose로 여러 컨테이너 관리

중급 단계

  1. 쿠버네티스 아키텍처 이해
  2. MinikubeKind로 로컬 클러스터 구축
  3. 파드, 서비스, 디플로이먼트 실습
  4. kubectl 명령어 숙달

고급 단계

  1. Helm으로 패키지 관리
  2. 모니터링 (Prometheus, Grafana)
  3. 로깅 (ELK Stack, Loki)
  4. CI/CD 파이프라인 구축
  5. 클라우드 쿠버네티스 서비스 (EKS, GKE, AKS) 사용

더 자세히 알고 싶은 부분이 있으시면 말씀해 주세요! 특정 주제에 대해 더 깊이 설명해 드릴 수 있습니다. 😊

댓글 없음:

미네르바대학 입학

 미네르바대학 미네르바대학교 (Minerva University) 입학요강, 핵심만 깔끔하게 정리해줄게요. 프레젠테이션용 인포그래픽 파일 제작해줘 🧠 미네르바대학이 뭐가 다른데? 캠퍼스 거의 없음 → 수업은 100% 온라인(세미나식) ...