D: Docker Compose는 멀티 컨테이너 애플리케이션을 정의하고 실행하기 위한 강력한 도구입니다. 하지만 YAML 파일 작성 시 실수하기 쉽고, 최적화되지 않은 설정은 성능 저하로 이어질 수 있어요. 개발자라면 꼭 알아야 할 실용적인 팁을 알려드립니다!
1. 기본 구조 이해하기 📝
version: '3.8' # 최신 버전 사용 권장
services:
web:
image: nginx:alpine
ports:
- "80:80"
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
- version: 3.x 이상 사용 (최신 기능 활용)
- services: 각 컨테이너 서비스 정의
- 네트워크/볼륨은 자동 생성되지만 명시적으로 정의 가능
2. 환경 변수 관리의 달인 되기 🔑
(1) .env
파일 활용
# .env 파일
DB_PASSWORD=super_secret
WEB_PORT=8080
# docker-compose.yml
services:
db:
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
(2) 환경 변수 파일 분리
env_file:
- db.env
- web.env
💡 비밀번호 같은 민감정보는 절대 YAML에 직접 노출 금지!
3. 의존성 관리 Smart하게 ⏳
services:
web:
depends_on:
- db
- redis
healthcheck: # 추가 추천!
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
depends_on
만으로는 준비 상태를 보장하지 않음- healthcheck 추가로 실제 서비스 가능 상태 확인
4. 볼륨 사용 시 필수 팁 💾
services:
app:
volumes:
- type: bind
source: ./app
target: /usr/src/app
- data_volume:/var/lib/mysql
volumes:
data_volume:
- 로컬 개발 시:
bind mount
로 실시간 코드 반영 - 프로덕션: 이름 지정 볼륨(named volume) 사용
- 최적화:
:cached
(MacOS) 또는:delegated
사용
5. 리소스 제한 필수 설정 ⚖️
services:
redis:
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
reservations:
memory: 256M
- 메모리 누수 방지
- CPU 스파이크로 인한 전체 시스템 영향도 감소
6. 네트워크 고급 설정 🌐
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
backend:
internal: true # 외부 격리
services:
web:
networks:
- frontend
db:
networks:
- backend
- internal 네트워크: 보안 강화
- 사용자 정의 서브넷: IP 충돌 방지
7. 개발 vs 프로덕션 분리 🏭
docker-compose.override.yml 활용
# docker-compose.yml (기본)
services:
web:
image: myapp:prod
restart: always
# docker-compose.override.yml (개발)
services:
web:
build: .
volumes:
- .:/code
ports:
- "8000:8000"
docker-compose up
시 자동으로 병합 적용
8. 성능 향상을 위한 추가 팁 �
- 이미지 태그 명시:
latest
대신nginx:1.21-alpine
- 멀티-스테이지 빌드: 최종 이미지 크기 축소
- restart 정책:
restart: unless-stopped
- 로그 제어:
logging: driver: "json-file" options: max-size: "10m" max-file: "3"
9. 검증 도구 활용하기 🔍
- YAML 문법 검사:
docker-compose config
- hadolint: Dockerfile 린팅
- VS Code 확장: Docker + YAML 지원
10. 실전 예제: Django + Postgres 🐍+🐘
version: '3.8'
services:
db:
image: postgres:13
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- postgres_data:/var/lib/postgresql/data
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
volumes:
postgres_data:
마무리 🎯
Docker Compose는 단순한 설정 파일이 아니라 애플리케이션 인프라의 청사진입니다. 이 가이드를 참고하여:
- 재사용 가능한 템플릿 만들기
- 버전 컨트롤 시스템에 관리
- 팀 내부 표준 가이드 문서화
컨테이너 관리가 편해지면 개발 생산성이 200% 상승하는 걸 경험하실 거예요! 🚀