도커, 컨테이너, 쿠버네티스 완벽 가이드
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: 컨테이너가 트래픽을 받을 준비가 되었는지 확인
🌊 롤링 업데이트 & 롤백
- 무중단으로 새 버전을 배포합니다
- 문제가 생기면 이전 버전으로 즉시 롤백할 수 있습니다
🔐 시크릿 & 구성 관리
- 코드와 설정을 분리하여 관리합니다
- 민감한 정보를 안전하게 저장합니다
🔗 세 가지의 관계
컨테이너 (개념)
↓
도커 (컨테이너를 만들고 실행하는 도구)
↓
쿠버네티스 (여러 컨테이너를 관리하고 오케스트레이션하는 플랫폼)
실제 사용 예시
- 개발자가 애플리케이션을 작성합니다
- Dockerfile을 작성하여 애플리케이션을 컨테이너화합니다
- 도커로 이미지를 빌드하고 레지스트리에 푸시합니다
- 쿠버네티스 매니페스트(YAML 파일)를 작성합니다
- kubectl로 쿠버네티스에 배포합니다
- 쿠버네티스가 자동으로 컨테이너를 실행, 관리, 스케일링합니다
📚 학습 로드맵
초급 단계
- 리눅스 기본 명령어 익히기
- 도커 설치 및 기본 명령어 학습
- 간단한 Dockerfile 작성 연습
- Docker Compose로 여러 컨테이너 관리
중급 단계
- 쿠버네티스 아키텍처 이해
- Minikube나 Kind로 로컬 클러스터 구축
- 파드, 서비스, 디플로이먼트 실습
- kubectl 명령어 숙달
고급 단계
- Helm으로 패키지 관리
- 모니터링 (Prometheus, Grafana)
- 로깅 (ELK Stack, Loki)
- CI/CD 파이프라인 구축
- 클라우드 쿠버네티스 서비스 (EKS, GKE, AKS) 사용
더 자세히 알고 싶은 부분이 있으시면 말씀해 주세요! 특정 주제에 대해 더 깊이 설명해 드릴 수 있습니다. 😊
댓글 없음:
댓글 쓰기