Docker는 애플리케이션 배포를 위한 컨테이너 기술로, 개발 환경과 운영 환경 간의 불일치 문제를 해결하고 손쉬운 확장성을 제공한다. GKE(Google Kubernetes Engine)는 Kubernetes 기반 컨테이너 오케스트레이션 플랫폼으로, Docker 컨테이너를 효율적으로 관리하고 확장할 수 있도록 도와준다. 하지만 Docker 이미지 크기 증가, GKE 환경에서의 복잡한 배포 과정은 여전히 개발자들에게 어려움으로 다가온다.
Stack Overflow에는 Docker 이미지 최적화, GKE 환경에 맞는 CI/CD 파이프라인 구축 및 자동화 관련 질문들이 끊이지 않고 올라온다. Docker 이미지 크기를 줄이기 위해서는 불필요한 레이어 제거, 멀티 스테이지 빌드 활용, 알파인 리눅스 기반 이미지 사용 등 다양한 기법을 적용해야 한다. 또한 GKE 환경에 맞는 CI/CD 파이프라인을 구축하여 빌드, 테스트, 배포 과정을 자동화하고, 개발 생산성을 향상시킬 수 있다.
Docker Compose를 활용하거나 Kubernetes를 직접 관리하는 방법도 있지만, GKE를 사용하면 더욱 편리하게 배포 자동화를 구현할 수 있다. GKE는 Kubernetes 클러스터 관리, 자동 확장, 로드 밸런싱 등 다양한 기능을 제공하여 개발자가 배포에 신경 쓰는 시간을 줄이고 개발에 집중할 수 있도록 돕는다.
Step-by-Step 가이드
Docker와 GKE를 이용하여 웹 애플리케이션을 효율적으로 배포하고 자동화하는 방법을 단계별로 알아보자.
1단계: Docker 이미지 최적화
- 불필요한 레이어 제거: Dockerfile에서
RUN
,COPY
,ADD
명령어를 최소화하고, 체이닝(chaining)을 통해 레이어 수를 줄인다. - 멀티 스테이지 빌드 활용: 빌드 환경과 실행 환경을 분리하여 이미지 크기를 줄인다.
- 알파인 리눅스 기반 이미지 사용: 가볍고 보안성이 높은 알파인 리눅스 기반 이미지를 사용한다.
Dockerfile 예 :
# 빌드 단계
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 실행 단계
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["npm", "start"]
2단계: GKE 클러스터 생성 및 설정
- GCP 콘솔 또는 gcloud CLI를 사용하여 GKE 클러스터 생성: 클러스터 이름, 지역, 노드 수 등을 설정한다.
- kubectl CLI 설치 및 클러스터 연결:
gcloud container clusters get-credentials [클러스터 이름]
명령어를 실행하여 클러스터에 연결한다.
3단계: Kubernetes 매니페스트 파일 작성
- Deployment: 애플리케이션 컨테이너를 관리하고, 원하는 상태를 유지하도록 설정한다.
- Service: 외부에서 애플리케이션에 접근할 수 있도록 설정한다.
- Ingress: 도메인 이름을 기반으로 트래픽을 라우팅한다.
Deployment 매니페스트 예:
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: gcr.io/[프로젝트 ID]/my-app:latest
ports:
- containerPort: 3000
4단계: CI/CD 파이프라인 구축
- GitHub Actions, GitLab CI, CircleCI 등 CI/CD 도구 선택: 프로젝트에 맞는 도구를 선택한다.
- 파이프라인 정의: 코드 변경 감지, 빌드, 테스트, Docker 이미지 생성, GKE 배포 등 단계를 정의한다.
GitHub Actions Workflow 예:
name: CI/CD
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build and push Docker image
run: |
docker build -t gcr.io/[프로젝트 ID]/my-app:latest .
docker push gcr.io/[프로젝트 ID]/my-app:latest
- name: Deploy to GKE
uses: google-github-actions/get-gke-credentials@v0
with:
cluster_name: [클러스터 이름]
location: [클러스터 지역]
- name: Apply Kubernetes manifests
run: kubectl apply -f deployment.yaml
5단계: 모니터링 및 로깅 설정
- GKE Monitoring: 클러스터 및 애플리케이션 상태를 모니터링한다.
- Cloud Logging: 로그를 수집하고 분석한다.
참고 자료:
- Docker 공식 문서: https://docs.docker.com/
- GKE 공식 문서: https://cloud.google.com/kubernetes-engine