— DevOps Advanced Study

🐳 Docker 실무

Multi-stage Build를 통한 이미지 최적화와 Docker Compose를 이용한 다중 컨테이너 오케스트레이션을 학습합니다.

2026 DevOps
7 슬라이드
Build once, Run anywhere
01 — Multi-stage Build 개념

🏗️ Multi-stage Build란?

하나의 Dockerfile 안에서 여러 개의 FROM 구문을 사용하여 빌드 단계(Stage)를 나누는 기법입니다.

🚀 왜 사용하는가?

  • 이미지 크기 최소화: 빌드에만 필요한 도구(SDK, 컴파일러 등)를 최종 이미지에서 제외합니다.
  • 보안 강화: 소스 코드나 불필요한 바이너리를 배포 이미지에 포함하지 않아 공격 표면을 줄입니다.
  • 캐싱 최적화: 단계별로 레이어를 나누어 빌드 속도를 향상시킬 수 있습니다.

💡 비교: 일반 빌드 방식은 "빌드 도구 + 소스 + 결과물"이 모두 포함되어 수백 MB가 넘어가지만, Multi-stage는 "결과물"만 담아 수십 MB로 줄일 수 있습니다.

02 — Nginx 웹 서버 개요

🟢Nginx란?

Nginx (Engine-X)

Nginx는 가볍고 성능이 뛰어난 웹 서버(Web Server)이자 리버스 프록시(Reverse Proxy)입니다.

🌟 주요 특징

  • 비동기 이벤트 기반 구조: 적은 메모리로 많은 동시 접속 처리가 가능합니다.
  • 리버스 프록시: 클라이언트의 요청을 대신 받아 백엔드 서버로 전달합니다.
  • 정적 파일 서빙: HTML, CSS, 이미지 등을 매우 빠르게 제공합니다.

📚 용어 정리

1. 비동기 (Asynchronous)

  • 동기(Sync): 식당에서 주문 후 음식이 나올 때까지 기다리는 것
  • 비동기(Async): 주문 후 진동벨을 받고 다른 일을 하다가, 벨이 울리면 음식을 가져오는 것

2. 프록시 / 리버스 프록시 (Reverse Proxy)

  • 포워드 프록시: 클라이언트 앞에 위치하여, 클라이언트를 대신해 외부 서버에 요청을 보냅니다.
  • 리버스 프록시: 서버 앞에 위치하여, 외부 요청을 받아 내부 백엔드 서버로 전달합니다.

3. 로드밸런싱 (Load Balancing)

들어오는 트래픽을 여러 서버에 균등하게 분산시켜 특정 서버의 과부하를 방지하는 기술입니다.

03 — Multi-stage Build Node.js

💻 Multi-stage 실습 예제 (Node.js)

node_modules와 빌드 도구를 제외하고 실행에 필요한 결과물만 최종 이미지에 포함합니다.

# Stage 1: 의존성 설치 + 빌드 FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Stage 2: 실행 이미지 (dev 의존성 제외) FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --omit=dev COPY --from=builder /app/dist ./dist CMD ["node", "dist/index.js"]

📦 이미지 크기 비교

  • 단순 빌드: ~1.2 GB (node_modules + devDependencies 포함)
  • Multi-stage: ~180 MB (프로덕션 의존성 + dist만 포함)

💡 핵심 포인트

  • npm ci: package-lock.json 기준 정확한 버전 설치 (CI 환경 권장)
  • --omit=dev: devDependencies 제외하고 설치
  • COPY --from=builder: 이전 스테이지의 파일만 선택적으로 복사
04 — Docker Compose 개요

📋 Docker Compose란?

여러 개의 컨테이너를 정의하고 실행하기 위한 도구입니다. YAML 파일을 사용하여 애플리케이션의 서비스를 설정합니다.

🌟 주요 특징

  • 단일 명령 실행: docker-compose up 한 번으로 모든 서비스를 시작합니다.
  • 서비스 격리: 각 프로젝트마다 독립된 환경을 유지합니다.
  • 데이터 보존: 컨테이너가 삭제되어도 볼륨을 통해 데이터를 유지합니다.
  • 네트워크 자동 생성: 서비스 간 통신을 위한 기본 네트워크를 자동으로 구축합니다.
05 — Docker Compose CLI 명령어

⚡ 주요 명령어 (CLI)

실제 운영 시 가장 자주 사용되는 Compose 명령어 모음입니다.

명령어 설명
docker-compose up -d 모든 서비스를 생성하고 백그라운드에서 실행
docker-compose down 모든 컨테이너와 네트워크를 정지시키고 삭제
docker-compose logs -f 실행 중인 서비스의 로그를 실시간 확인
docker-compose ps 현재 Compose 프로젝트의 컨테이너 상태 확인
docker-compose exec [서비스] sh 실행 중인 컨테이너 내부에 접속
06 — 종합 실습 FastAPI + Redis

🔥 실습: FastAPI + Redis 방문자 카운터

FastAPI 웹 앱과 Redis를 Compose로 연결하여 방문자 수를 기록하는 실습입니다. 서비스 간 이름으로 통신하는 원리를 체험합니다.

app.py

# app.py import redis from fastapi import FastAPI app = FastAPI() # 서비스명 'redis'로 자동 연결 r = redis.Redis(host='redis', port=6379) @app.get('/') def hello(): count = r.incr('hits') return {"방문자 수": count}

docker-compose.yml

services: web: build: . ports: - "8000:8000" depends_on: - redis redis: image: redis:alpine

✅ 핵심 포인트

  • 같은 Compose 네트워크 내에서는 서비스 이름이 곧 호스트명
  • redis라는 이름으로 별도 IP 없이 바로 접근 가능
  • FastAPI는 JSON 응답을 dict 반환만으로 자동 직렬화
  • 기본 포트 8000, uvicorn으로 실행
이동  ·  T 테마