728x90
반응형
SMALL
이제 앞서 구성한 풀스택 앱(백엔드, 프론트엔드, DB, Redis)을 프로덕션 환경에 배포해 봅시다. 여기서는 두 가지 접근 방식을 나누어 소개합니다.
- Docker Swarm: 설치가 간단하고 Docker CLI와 친화적
- 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)
- 로컬 개발은 Docker Compose로 간단히 설정하고, 프로덕션에서는 Swarm이나 Kubernetes를 활용해 확장성과 고가용성을 갖춘 환경을 구현합니다.
- CI/CD 파이프라인을 연동하여 코드 푸시 → 자동 빌드 → 자동 배포 과정을 확립하면, 개발 속도와 신뢰성을 크게 향상시킬 수 있습니다.
- Swarm은 간편한 설정으로 소규모/중규모 프로젝트에 적합하고, Kubernetes는 광범위한 생태계와 클라우드 네이티브 지원으로 대규모 프로젝트에 주로 쓰입니다.
🎉 마무리
- 10강에 걸친 Docker 강의를 통해,
- Docker 기본 개념과 가상 환경 관리
- Dockerfile, 네트워킹, 볼륨
- Docker Compose, Swarm, Kubernetes 등 오케스트레이션 도구
- 배포 자동화와 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
'소프트웨어 개발 > Docker' 카테고리의 다른 글
🐳 Docker 강의 10강 1편: 실전 프로젝트 (개발 환경) - Docker Compose로 풀스택 앱 구성 (0) | 2025.01.27 |
---|---|
🐳 Docker 강의 8강: Docker Swarm 기본 클러스터링 (0) | 2025.01.27 |
🐳 Docker 강의 7강: Docker 배포 전략 – 이미지 최적화와 Private Registry 활용 (0) | 2025.01.27 |
🐳 Docker 강의 5강: Docker 볼륨과 데이터 관리 (0) | 2025.01.27 |
🐳 Docker 강의 6강: Docker Compose를 활용한 멀티 컨테이너 환경 구성 (0) | 2025.01.27 |