Docker/GKE, 손쉬운 배포 자동화로 개발 생산성 UP! CI/CD 파이프라인 구축 가이드

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: 로그를 수집하고 분석한다.

참고 자료: