PostgreSQL과 Docker: 컨테이너 배포 모범
Docker 환경에서 PostgreSQL을 안정적으로 배포하고 운영하기 위한 이미지 선택, 데이터 지속성, 보안, 백업 및 모니터링을 포함한 운영 전략
목차
소개
Docker로 PostgreSQL을 배포할 때는 단순 실행을 넘는 고려가 필요하다. 성능, 데이터 보존, 보안, 장애 대응까지 모두 다뤄야 한다. 이 글은 처음 접하는 운영자도 이해하기 쉽도록 단계별로 정리했다. 핵심은 일관성 있고 자동화된 설정에 있다.
왜 Docker와 PostgreSQL을 함께 쓰는가
컨테이너는 환경 일관성을 제공한다. 여러 환경에서 동일한 이미지로 동작한다. 또한 배포 및 롤백이 쉬워 개발과 운영 간 간극을 줄여준다. 다만 데이터 지속성과 성능 제약을 고려해야 한다.
이미지 선택과 태깅 전략
공식 이미지를 기본으로 사용하되 태그를 명시한다. 최신 태그 대신 버전 고정이 필요하다. 예를 들어 14.5 같은 구체적 태그를 사용하면 예기치 않은 변경을 방지한다.
권장 사항
- 공식 이미지(postgres)를 사용
- 정확한 버전 태그 사용(예: postgres:14.5)
- 커스텀 이미지가 필요한 경우 베이스 이미지를 명확히 관리
데이터 지속성 (Volumes)
DB 데이터는 컨테이너 외부에 보관해야 한다. 로컬 컨테이너 레이어는 휘발성이므로 호스트 볼륨이나 네트워크 스토리지를 사용한다. 퍼포먼스와 안전성을 고려해 볼륨 드라이버를 선택한다.
예시: docker-compose 볼륨 설정
version: '3.8'
services:
db:
image: postgres:14.5
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
restart: unless-stopped
volumes:
db_data:
driver: local
환경 변수와 시크릿 관리
패스워드나 키는 이미지에 하드코딩하지 않는다. 도커 시크릿이나 외부 시크릿 매니저를 사용한다. 개발 환경에서는 .env 파일을 쓰되 프로덕션에서는 시크릿 스토리지를 권장한다.
보안 기본 설정
네트워크 접근 제어와 최소 권한 원칙을 적용한다. 직접 노출되는 포트는 필요할 때만 연다. 또한 SSL/TLS를 적용하고 인증 방식을 강화한다.
보안 체크리스트
- 관리 포트 최소화
- 강력한 패스워드 및 역할 분리
- SSL 연결 강제
- 시크릿은 시크릿 매니저로 관리
백업과 복구 전략
정기 백업과 복구 테스트는 필수다. pg_dump나 파일시스템 스냅샷 방식을 상황에 맞게 선택한다. 복구 절차는 문서화하고 자동화해 복구 시간을 단축한다.
간단한 백업 예시
# 컨테이너 내부에서 실행하는 예시
PGPASSWORD=secret pg_dump -U myuser -h localhost mydb > /backups/mydb_$(date +%F).sql
성능과 리소스 제한
컨테이너에 리소스 제한을 설정한다. 메모리와 CPU 할당을 통해 노드 전체의 안정성을 보장한다. 또한 PostgreSQL 설정(shared_buffers 등)을 컨테이너 리소스에 맞춰 조정한다.
모니터링과 헬스체크
헬스체크를 설정하여 컨테이너 상태를 자동으로 감지한다. 또한 메트릭 수집(Prometheus 등)을 통해 쿼리 지연, 커넥션 수, 디스크 사용량을 모니터링한다.
docker-compose 헬스체크 예
services:
db:
image: postgres:14.5
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser"]
interval: 10s
timeout: 5s
retries: 5
운영 best practice 모음
- 이미지 버전 고정 및 변경 기록 유지
- 데이터는 볼륨으로 관리하고 스냅샷 정책 적용
- 시크릿은 외부 매니저로 분리
- 정기 백업 및 복구 연습 수행
- 리소스 제한과 PostgreSQL 튜닝 병행
- 헬스체크와 모니터링으로 문제 조기 탐지
실제 배포 워크플로우 예
자동화된 CI 파이프라인에서 이미지를 빌드하고 태그를 붙인다. 스테이징에서 smoke test를 수행한 뒤 프로덕션에 배포한다. 롤백 플랜을 준비하면 배포 실패 시 빠르게 이전 상태로 복귀할 수 있다.
결론
docker postgresql 배포는 설정의 세밀함이 성패를 좌우한다. 데이터 지속성, 보안, 백업, 모니터링을 균형 있게 설계하면 안정적인 운영이 가능하다. 문서화와 자동화에 투자하면 운영 비용을 줄일 수 있다. 마지막으로 운영 중에는 postgres 컨테이너 운영 best practice를 지속적으로 검토하고 개선하는 것이 중요하다.
참고 키워드
docker postgresql 배포, postgres 컨테이너 운영 best practice, docker-compose postgres 설정