stack-analysis
CHAPTER 54 / 90
읽기 약 2분
FUNCTION
Docker Compose: 로컬 개발 환경
핵심 개념
Docker Compose·hot reload·DB·Redis·환경 변수 — 팀 onboarding 5분.
본문
기본 docker-compose.yml
# docker-compose.yml
version: '3.9'
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app_dev
ports:
- '5432:5432'
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U app']
interval: 5s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
ports:
- '6379:6379'
volumes:
- redis_data:/data
api:
build:
context: .
dockerfile: Dockerfile.dev
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
environment:
DATABASE_URL: postgresql://app:app@postgres:5432/app_dev
REDIS_URL: redis://redis:6379
NODE_ENV: development
ports:
- '3000:3000'
volumes:
- ./src:/app/src
- ./package.json:/app/package.json
- /app/node_modules
command: pnpm dev
mailhog:
image: mailhog/mailhog
ports:
- '1025:1025' # SMTP
- '8025:8025' # Web UI
volumes:
postgres_data:
redis_data:Dockerfile (개발용)
# Dockerfile.dev
FROM node:20-alpine
WORKDIR /app
# pnpm 설치
RUN corepack enable && corepack prepare pnpm@latest --activate
# 의존성 (캐시 최적화)
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
# 소스 (volume mount로 hot reload)
COPY . .
EXPOSE 3000
CMD ["pnpm", "dev"]명령어
# 시작
docker compose up -d
# 로그
docker compose logs -f api
# 특정 서비스 재시작
docker compose restart api
# 컨테이너 진입
docker compose exec api sh
docker compose exec postgres psql -U app -d app_dev
# 정리 (볼륨 포함)
docker compose down -v멀티 환경 (override)
# docker-compose.yml — 기본
# docker-compose.override.yml — 로컬 (자동 적용)
services:
api:
environment:
DEBUG: '*'
volumes:
- ./src:/app/src # 로컬만 hot reload
# docker-compose.prod.yml — 프로덕션
services:
api:
image: myapp:latest
restart: always
deploy:
resources:
limits:
memory: 512M# 프로덕션 모드
docker compose -f docker-compose.yml -f docker-compose.prod.yml up프로덕션 Dockerfile (multi-stage)
# Dockerfile
FROM node:20-alpine AS deps
WORKDIR /app
RUN corepack enable
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile --production
FROM node:20-alpine AS builder
WORKDIR /app
RUN corepack enable
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
USER nextjs
COPY --from=deps /app/node_modules ./node_modules
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["node", "server.js"]헬스체크
services:
api:
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3000/health']
interval: 30s
timeout: 10s
retries: 3
start_period: 40s// /health 엔드포인트
app.get('/health', async (req, res) => {
try {
await db.$queryRaw`SELECT 1`;
await redis.ping();
res.json({ status: 'ok', timestamp: new Date() });
} catch (err) {
res.status(503).json({ status: 'unhealthy', error: err.message });
}
});.dockerignore
node_modules
.next
.git
.env*
!.env.example
*.log
coverage
.vscode
.idea
dist
README.md다음 챕터
CH.55 "CI/CD: GitHub Actions 실전".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 코드의 Docker Compose 부분을 분석해서 실전 분석 + 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
Docker Compose 관련 인기 라이브러리/패턴 5개를 비교 분석해서 패턴 추출를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 Docker Compose 최적화 가능 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 백엔드 시장의 Docker Compose 트렌드를 솔직히 알려줘.
⭐ 이것만 기억하세요
Docker Compose: 로컬 개발 환경은 이 3가지만 확실히 잡으세요
1.Docker Compose = 팀 onboarding 5분 — DB·Redis·이메일까지 한 번에
2.depends_on + healthcheck로 시작 순서 보장
3.프로덕션 Dockerfile은 multi-stage — 이미지 크기 1/10
공유하기
진행도 54 / 90