소프트웨어 개발/Docker

🐳 Docker 강의 10-2: 실전 프로젝트 (운영 환경) - Swarm/K8S를 이용한 배포

브라더댄 2025. 1. 27. 01:18
728x90
반응형
SMALL

 

이제 앞서 구성한 풀스택 앱(백엔드, 프론트엔드, DB, Redis)을 프로덕션 환경에 배포해 봅시다. 여기서는 두 가지 접근 방식을 나누어 소개합니다.

  1. Docker Swarm: 설치가 간단하고 Docker CLI와 친화적
  2. Kubernetes: 업계 표준, 클라우드 네이티브 생태계와 궁합이 좋음

🚢 1. Docker Swarm 배포 예시

1.1 Swarm 네트워크 & 볼륨 설정

docker swarm init
docker network create -d overlay my-overlay
docker volume create my-swarm-db

1.2 stack.yml (Swarm 스택)

version: "3.8"
services:
  backend:
    image: my-backend:latest
    networks:
      - my-overlay
    depends_on:
      - db
      - cache
    ports:
      - "4000:4000"

  frontend:
    image: my-frontend:latest
    networks:
      - my-overlay
    depends_on:
      - backend
    ports:
      - "3000:3000"

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: secret
    networks:
      - my-overlay
    volumes:
      - my-swarm-db:/var/lib/mysql

  cache:
    image: redis:latest
    networks:
      - my-overlay

networks:
  my-overlay:
    external: true

volumes:
  my-swarm-db:
    external: true

Tip: 이미지 배포
my-backend:latest, my-frontend:latest 이미지는 레지스트리(도커 허브나 프라이빗 레지스트리)에 push되어 있어야 Swarm 클러스터의 모든 노드에서 pull이 가능합니다.

1.3 Swarm stack 배포

docker stack deploy -c stack.yml my-sns
  • 결과: Swarm 모드에서 my-sns라는 스택이 생성되고, 네 개의 서비스가 overlay 네트워크에서 실행됩니다.

1.4 스케일링

docker service scale my-sns_backend=3
docker service scale my-sns_frontend=2
  • 백엔드 컨테이너를 3개, 프론트엔드를 2개로 늘립니다.
  • Swarm은 자동으로 각 노드에 컨테이너를 분산 배치합니다.

☸️ 2. Kubernetes 배포 예시

2.1 Docker 이미지 준비

  • 로컬 K8s(Minikube 등)일 경우 minikube image load my-backend:latest
  • 또는 레지스트리 푸시 → YAML에서 image: <registry>/my-backend:latest 형태로 사용.

2.2 Deployment & Service

backend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: my-backend:latest
        ports:
        - containerPort: 4000
---
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  type: ClusterIP
  selector:
    app: backend
  ports:
    - port: 4000
      targetPort: 4000

frontend-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend
        image: my-frontend:latest
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort
  selector:
    app: frontend
  ports:
    - port: 3000
      targetPort: 3000
      nodePort: 30001

db-deployment.yaml & redis-deployment.yaml 유사하게 작성(혹은 StatefulSet 사용).

2.3 배포

kubectl apply -f backend-deployment.yaml
kubectl apply -f frontend-deployment.yaml
# ... etc
  • 결과: K8s 클러스터에서 Pod이 2개씩 생성되고, NodePort 30001로 접근이 가능.

Tip: LoadBalancer Service
클라우드 환경(AWS, GCP 등)에서는 Service를 type: LoadBalancer로 설정하면 클라우드 로드 밸런서를 자동으로 할당해줍니다.


🤖 3. CI/CD 파이프라인 예시

3.1 GitHub Actions (간략 버전)

name: CI-CD

on: [push]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Build Backend
        run: |
          docker build -t my-backend:latest ./backend
      - name: Build Frontend
        run: |
          docker build -t my-frontend:latest ./frontend
      - name: Push to Registry
        run: |
          docker login -u $REGISTRY_USER -p $REGISTRY_PASS
          docker push my-backend:latest
          docker push my-frontend:latest

  deploy:
    runs-on: ubuntu-latest
    needs: [build-and-push]
    steps:
      - name: Deploy to Swarm
        run: |
          ssh user@swarm-manager "docker stack deploy -c /path/stack.yml my-sns"
  • 코드가 푸시되면, Docker 이미지를 빌드 후 레지스트리에 푸시합니다.
  • 이후 SSH로 Swarm Manager에 접속하여 docker stack deploy로 업데이트하는 시나리오.

Tip: Kubernetes 배포
Kubernetes 배포 시에는 kubectl CLI를 Actions에서 사용할 수 있도록 설정한 뒤, kubectl apply -f 명령을 실행하면 됩니다. GitOps 방식(Argo CD, Flux) 등을 도입하면 더 세련된 방법으로 운영 가능합니다.


📝 최종 정리 (10-2)

  1. 로컬 개발은 Docker Compose로 간단히 설정하고, 프로덕션에서는 Swarm이나 Kubernetes를 활용해 확장성과 고가용성을 갖춘 환경을 구현합니다.
  2. CI/CD 파이프라인을 연동하여 코드 푸시 → 자동 빌드 → 자동 배포 과정을 확립하면, 개발 속도와 신뢰성을 크게 향상시킬 수 있습니다.
  3. Swarm은 간편한 설정으로 소규모/중규모 프로젝트에 적합하고, Kubernetes는 광범위한 생태계와 클라우드 네이티브 지원으로 대규모 프로젝트에 주로 쓰입니다.

🎉 마무리

  • 10강에 걸친 Docker 강의를 통해,
    1. Docker 기본 개념과 가상 환경 관리
    2. Dockerfile, 네트워킹, 볼륨
    3. Docker Compose, Swarm, Kubernetes 등 오케스트레이션 도구
    4. 배포 자동화와 CI/CD 파이프라인
      …을 단계별로 학습했습니다.
  • 지금까지 익힌 내용을 바탕으로 개인 프로젝트 회사 내부 프로젝트에 Docker를 적극 활용해 보세요.

Tip: 계속 배워나가기

  • CI/CD 도구: Jenkins, GitLab CI, Tekton, Argo CD …
  • Observability: Prometheus, Grafana, EFK/ELK Stack …
  • IaC(Infrastructure as Code): Terraform, Ansible …
  • 클라우드 플랫폼: AWS, GCP, Azure …

Docker와 함께 하는 여정은 이제 시작입니다. 🎉
앞으로 더 많은 실무 경험과 프로젝트를 통해 여러분만의 인프라 노하우를 쌓아가길 바랍니다!


더 알아보기:

강의를 모두 마치신 것을 축하드립니다! 🐳

728x90
반응형
LIST