소프트웨어 개발/Docker

🐳 Docker 강의 7강: Docker 배포 전략 – 이미지 최적화와 Private Registry 활용

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

이전 강의에서 Docker Compose를 통해 멀티 컨테이너 환경을 구성했다면, 이제는 이미지 최적화, 프라이빗 레지스트리 설정, 그리고 CI/CD 파이프라인 연동을 통해 실제 배포 환경에서 Docker를 더욱 효율적으로 운용하는 방법을 살펴보겠습니다.

🚀 강의 목표

  • 멀티스테이지(Multi-stage) 빌드 기법을 이해하고, 이미지 최적화 방법을 익힙니다.
  • **프라이빗 레지스트리(Private Registry)**를 설정하여 사내 환경이나 개인 서버에서 이미지를 안전하게 보관하고 배포합니다.
  • CI/CD 파이프라인과 Docker 연동 시 주의할 점과 효율적인 설정 방법을 제시합니다.

1. 왜 Docker 이미지 최적화가 필요한가?

1.1 이미지 크기가 커질수록 발생하는 문제

  1. 빌드/배포 시간 증가: 이미지가 큰 경우, CI/CD 파이프라인에서 빌드 & 푸시/풀 시간이 길어집니다.
  2. 스토리지 비용 상승: 여러 버전의 이미지를 관리하다 보면, 저장소 공간이 빠르게 소모됩니다.
  3. 전송 지연: Kubernetes 등 분산 환경에서 이미지를 여러 노드에 배포할 때 대역폭이 낭비되고, 배포 속도가 느려집니다.

Tip: 이미지 크기를 주기적으로 모니터링
작은 규모의 프로젝트라도, 버전이 누적되면 어느새 수백 MB 이상의 이미지가 쌓일 수 있습니다.
CI/CD 과정에서 docker image ls 결과를 파이프라인 로그에 기록해, 이미지 크기를 모니터링하는 것도 좋은 습관입니다.


2. 멀티스테이지 빌드(Multi-stage Build)

2.1 기본 개념

멀티스테이지 빌드는 하나의 Dockerfile에서 여러 FROM을 사용해 빌드용 이미지런타임용 이미지를 분리하는 기법입니다. 예를 들어, 대규모 라이브러리를 이용해 애플리케이션을 빌드한 후, 실제 배포 시에는 빌드 결과물(바이너리, 패키지)만 가져다가 런타임 이미지에 담을 수 있습니다.

2.2 예시: Go 애플리케이션

# 1) 빌드 단계
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# 2) 배포 단계
FROM alpine:3.16
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
  • builder 단계: Go 언어와 빌드 툴이 포함된 이미지를 사용.
  • 최종 단계: 경량 base 이미지(Alpine)를 사용해 빌드된 실행 파일만 복사.

Tip: 러닝타임만 필요한 경우
RUN go test ... 같은 테스트나 RUN apt-get install ... 같은 빌드 의존성은 모두 빌드 단계에 포함시키고, 최종 단계에는 필요 최소 파일만 복사하면 이미지 크기가 현저히 줄어듭니다.

2.3 Python/Node.js 등에서도 동일

  • Python: 빌드 과정(의존성 설치, C 확장 빌드)을 builder 단계에서 수행 후, 최종 단계에서는 필요한 라이브러리만 복사.
  • Node.js: npm install 또는 yarn install을 빌드 이미지에서 수행하고, node_modules를 런타임 이미지로 옮기는 식으로 최적화.

3. Docker Registry 활용

3.1 Docker Hub 또는 Private Registry?

  • Docker Hub: 가장 대표적인 퍼블릭 레지스트리, 계정이 있으면 누구나 이미지를 올리고 받을 수 있음.
  • Private Registry: 사내 프로젝트나 민감한 이미지를 비공개로 운영하고 싶다면 프라이빗 레지스트리를 구성할 수 있습니다.

3.2 Private Registry 설치

  1. Local Registry 컨테이너 실행
    • 호스트의 5000번 포트를 사용하는 Private Registry가 기동됩니다.
  2. docker run -d -p 5000:5000 --name registry registry:2
  3. 이미지 태깅 & 푸시
    • 이제 로컬 레지스트리에 myapp:1.0 이미지가 업로드됩니다.
  4. docker tag myapp localhost:5000/myapp:1.0 docker push localhost:5000/myapp:1.0
  5. 풀(Pull)하여 확인
    • 같은 호스트, 혹은 적절히 네트워크로 연결된 환경에서 이미지를 받을 수 있음.
  6. docker pull localhost:5000/myapp:1.0

Tip: 인증(SSL/TLS) 구성
기본적으로 registry:2 이미지는 HTTP(비보안)로 동작합니다. 프로덕션 환경에서는 HTTPS 인증서를 적용해야 합니다.

  • docker run 시 volume 마운트로 certs 디렉터리를 연결해 TLS 설정 파일을 넣거나, Reverse Proxy(Nginx 등)를 앞단에 두어 https를 terminate하는 방식을 권장합니다.

4. CI/CD 파이프라인 연동 예시

4.1 GitHub Actions 예시

.github/workflows/ci.yml

name: CI

on: [push, pull_request]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to private registry
        run: echo "$REGISTRY_PASSWORD" | docker login localhost:5000 -u "$REGISTRY_USER" --password-stdin

      - name: Build and push
        run: |
          docker build -t localhost:5000/myapp:${{ github.sha }} .
          docker push localhost:5000/myapp:${{ github.sha }}
  • Set up Docker Buildx: 멀티 아키텍처 빌드나 캐시 기능 활용 가능.
  • Login to private registry: CI 과정에서 레지스트리에 인증.
  • Build and push: 커밋 SHA를 이미지 태그로 사용해 버전 관리.

Tip: CI 환경에서 Private Registry 접근

  • Registry가 내부 네트워크에 있거나, VPN을 통해 접근해야 하는 경우가 많습니다. Actions에서 self-hosted runner를 사용하거나, 클라우드 레지스트리에 노출되는 방식 등을 고려해야 합니다.

4.2 GitLab CI/CD, Jenkins 등

  • GitLab CI/CD: .gitlab-ci.yml 파일에 docker build 및 docker push 스텝을 기술, CI_REGISTRY 환경 변수를 설정.
  • Jenkins: Docker Pipeline 플러그인 사용 가능. Jenkinsfile에서 docker.withRegistry(...) 등의 문법으로 레지스트리 접근.

5. 배포 전략 요약

  1. 이미지 크기 최적화
    • 멀티스테이지 빌드로 빌드 툴 등 불필요한 요소 제외.
    • Alpine 기반 이미지나 slim 태그 활용.
    • .dockerignore를 설정해 불필요한 파일(예: node_modules, logs, .git 등) 제외.
  2. 레지스트리 전략
    • 퍼블릭 레지스트리(Docker Hub): 오픈소스나 공개 프로젝트에 유리.
    • 프라이빗 레지스트리: 사내 이미지 보안 및 네트워크 트래픽 절감.
  3. CI/CD 파이프라인
    • 코드 변경 시 자동으로 Docker 이미지를 빌드 & 테스트 후, 레지스트리에 푸시.
    • Kubernetes, Swarm 등 오케스트레이션 툴과 연동해 자동 배포.

Tip: 배포 시 롤백(rollback) 전략
Docker 이미지는 태그별로 버전을 구분하기 쉬우므로, 문제가 발생할 경우 이전 버전 이미지를 재배포(롤백)하기가 상대적으로 수월합니다. CI/CD 파이프라인에서 실패 시 자동 롤백 구성도 고려해 보세요.


📝 정리

  1. 멀티스테이지 빌드: 이미지 크기를 획기적으로 줄여 빌드/배포 시간을 단축하고 리소스를 아낄 수 있습니다.
  2. 프라이빗 레지스트리: 민감한 이미지를 사내에서 안전하게 보관, 필요한 곳에만 배포 가능.
  3. CI/CD 파이프라인 연동: 자동화된 빌드-테스트-배포 사이클을 구축함으로써, 릴리스 속도와 코드 신뢰도를 높일 수 있습니다.

다음 강의 예고

다음 8강에서는 Docker Swarm 또는 Kubernetes로 확장하여 컨테이너 오케스트레이션을 다룰 예정입니다.

  • Swarm을 이용한 클러스터 구성
  • 마이크로서비스 확장 및 서비스 디스커버리
  • Kubernetes(쿠버네티스)와의 비교

지금까지 배운 Docker 기초부터 배포 전략을 한 단계 더 발전시켜, 대규모 서비스에도 적용해 보세요! 😊

더 알아보기: Docker 공식 문서 - Registry

 

728x90
반응형
LIST