피드로 돌아가기
Dev.toDevOps
원문 읽기
Your Docker Compose File Is Probably Wrong — 7 Mistakes I See in Every Project
Docker Compose 사용자들이 7가지 일반적인 설정 오류를 제거해 프로덕션 환경의 보안 취약점과 장애 위험 제거
AI 요약
Context
200개 이상의 Docker Compose 파일 검토 결과, 대부분의 프로젝트가 동일한 7가지 설정 오류를 포함하고 있었다. 이러한 오류들은 직접적인 버그는 아니지만 프로덕션 환경의 시간 폭탄, 보안 위협, 야간 긴급 대응 상황을 초래할 수 있다.
Technical Solution
- latest 태그 제거: 특정 버전(예: postgres:16.2-alpine)으로 고정해 스테이징과 프로덕션 간 버전 일치 보장
- 헬스 체크 추가: depends_on에 condition: service_healthy 조건 적용해 컨테이너 시작뿐 아니라 서비스 준비 완료까지 대기
- 환경변수 외부화: 하드코딩된 비밀번호를 ${DB_PASSWORD} 변수로 교체하고 .env 파일로 관리한 후 .gitignore에 추가
- 리소스 제한 설정: deploy.resources.limits에서 메모리(512M) 및 CPU(0.5) 제한 설정해 단일 컨테이너의 전체 서버 영향 방지
- Named Volume 사용: bind mount(./data:/var/lib/postgresql/data)를 Named Volume(pgdata:/var/lib/postgresql/data)으로 변경해 OS 간 권한 문제 해결 및 백업 용이성 확보
- Non-root 사용자 실행: Dockerfile에서 adduser로 앱 계정 생성 후 USER app 지정, Compose에서 user: "1000:1000" 설정해 컨테이너 침해 시 피해 범위 제한
- 재시작 정책 정의: restart: unless-stopped 설정해 프로덕션 환경에서 의도하지 않은 종료 제외 상황에서 자동 재시작
Key Takeaway
Docker Compose 설정의 작은 누락이 프로덕션 환경의 가용성, 보안, 운영 안정성에 직접적인 영향을 미치므로, 버전 고정, 헬스 체크, 외부 환경변수 관리, 리소스 제한, 권한 제한은 필수 구성 요소가 아닌 필수 기본사항이어야 한다.
실천 포인트
Docker Compose를 사용하는 팀에서 7가지 패턴(특정 버전 태그, healthcheck 조건부 대기, 환경변수 외부화, 메모리/CPU 제한, Named Volume, Non-root 사용자, unless-stopped 재시작 정책)을 체크리스트로 도입하면 프로덕션 장애, 보안 침해, OS 간 이식성 문제 발생률을 초기 단계부터 제거할 수 있다.