■ 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
- 네임스페이스 활용하기: 여러 환경이나 팀을 분리하기 위해 네임스페이스를 사용하자
- 리소스 제한 설정: CPU와 메모리 한계를 항상 설정하자
- 헬스 체크 구현: liveness와 readiness 프로브를 설정하자
- ConfigMap과 Secret 활용: 설정과 비밀 정보를 분리하자
- CI/CD 파이프라인 구축: 자동화된 배포 과정을 구축하자
Docker와 Kubernetes는 현대 애플리케이션 개발과 배포에 필수적인 도구이다.
Docker로 환경 일관성을 확보하고, Kubernetes로 확장성과 가용성을 높일 수 있다.
무엇보다 인프라를 코드로 관리할 수 있다는 점이 가장 큰 장점이라고 생각한다.
처음에는 개념과 명령어가 많아 어렵게 느껴질 수 있지만,
실제 프로젝트에 적용해보면 그 효율성을 체감할 수 있을 것이다.
'개발환경' 카테고리의 다른 글
Java와 Python 중 어떤 언어가 백엔드에 더 적합할까? (0) | 2025.05.20 |
---|---|
성능 모니터링과 로깅 (0) | 2025.05.18 |
클라우드 컴퓨팅 공부 메모: AWS, Azure, Google Cloud 비교 및 인프라 관리 (0) | 2025.05.14 |
웹 애플리케이션 보안 취약점과 강화 방법 (0) | 2025.05.13 |
Git 브랜치 전략과 효과적인 코드 리뷰 방법 (0) | 2025.05.12 |