— 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으로 실행