
왜 지금 도커 컴포즈 모니터링 체계를 구축해야 할까요
새벽 3시, 갑자기 울리는 휴대폰 알람 소리에 잠에서 깨어본 적이 있나요? 급히 노트북을 열고 서버에 접속했지만, 로그조차 남기지 못한 채 컨테이너가 죽어버린 상황을 마주하면 눈앞이 캄캄해지기 마련이에요. 도커 컴포즈로 관리되는 서비스는 관리가 편한 만큼, 문제가 생겼을 때 원인을 찾는 과정이 훨씬 까다로울 수 있어요.
단순히 컨테이너가 떠 있는지 확인하는 수준을 넘어, 왜 갑자기 CPU 사용량이 치솟았는지, 왜 특정 서비스의 메모리가 계속 증가하는지를 알아내는 과정이 반드시 필요해요. 이것이 바로 단순한 모니터링을 넘어선 관측성(Observability)의 핵심이에요. 준비되지 않은 상태에서 서비스를 확장하다 보면, 어느 순간 통제 불능의 상태에 빠지게 될 거예요.
이 글은 야간 장애 호출에 시달리는 운영자나, 안정적인 배포 환경을 원하는 개발자를 위해 작성되었어요. 도커 컴포즈 환경에서 어떻게 지표를 수집하고, 어떤 기준으로 알림을 설정해야 하는지 실무적인 관점에서 차근차근 설명해 드릴게요.
- 모니터링 스택 선택을 위한 판단 기준
- 메트릭, 로그, 트레이싱의 유기적인 구성 방법
- 실무에서 바로 쓰는 도커 컴포즈 설정 예시
- 장애를 미리 알려주는 알림 규칙 설계법
모니터링 시작 전 반드시 점검해야 할 준비 사항
무턱대고 모니터링 도구를 설치한다고 해서 모든 문제가 해결되지는 않아요. 오히려 잘못 설계된 모니터링 시스템은 서버의 자원을 과도하게 잡아먹어 또 다른 장애의 원인이 되기도 해요. 따라서 본격적인 구축에 앞서 우리 서비스에 맞는 도구를 선택하고, 무엇을 관측할지 명확히 정의하는 과정이 선행되어야 해요.
모니터링 도구 선택 기준 비교
시중에는 정말 다양한 도구가 있지만, 도커 컴포즈 환경에서는 관리의 편의성과 자원 효율성을 최우선으로 고려해야 해요. 아래 표를 통해 상황에 맞는 선택 기준을 확인해 보세요.
| 구분 | Prometheus 스택 | SaaS형 (Datadog 등) | 추천 상황 |
|---|---|---|---|
| 운영 비용 | 서버 자원 비용만 발생 | 사용량에 따른 높은 비용 | 비용 절감이 중요한 경우 |
| 설치 난이도 | 직접 구성 필요 (중간) | 에이전트만 설치 (매우 낮음) | 빠른 도입이 필요한 경우 |
| 데이터 제어 | 완전한 직접 제어 가능 | 플랫폼 제공 기능에 의존 | 보안 및 데이터 주권 중요 시 |
핵심 관측 지표 정의하기
무엇을 볼 것인지 정하지 않으면 알림 폭탄을 맞게 돼요. 컨테이너 운영에서 반드시 챙겨야 할 지표는 크게 네 가지 영역으로 나눌 수 있어요.
- 인프라 지표: 호스트 서버의 CPU, 메모리 사용량, 디스크 I/O, 네트워크 트래픽
- 컨테이너 지표: 각 컨테이너별 리소스 제한(Limit) 대비 사용량, 컨테이너 재시작 횟수
- 애플리케이션 지표: HTTP 요청 응답 시간(Latency), 에러율(Error Rate), 처리량(Throughput)
- 시스템 로그: 애플리케이션의 에러 로그, 커널 로그, 도커 엔진 로그
처음부터 모든 지표를 수집하려고 하지 마세요. 데이터 양이 너무 많아지면 저장 공간 부족 문제와 함께 검색 속도가 급격히 느려지는 부작용이 발생할 수 있어요.
도커 컴포즈 기반 관측 체계 단계별 구축 방법
이제 본격적으로 실제 환경에 적용할 수 있는 모니터링 시스템을 만들어 볼게요. 여기서는 가장 표준적이면서도 강력한 오픈소스 조합인 Prometheus, Grafana, Loki 스택을 기준으로 설명할게요. 이 조합은 도커 컴포즈 파일 하나로 전체 시스템을 쉽게 띄울 수 있다는 장점이 있어요.
STEP 1. 모니터링 에이전트와 기본 환경 구성하기
모니터링의 첫 단계는 데이터를 수집할 ‘눈’을 만드는 것이에요. 호스트 서버의 상태를 보는 에이전트와 컨테이너 내부의 상태를 보는 에이전트가 각각 필요해요.
먼저 node-exporter는 서버 본체의 물리적인 상태를 수집하고, cAdvisor는 개별 컨테이너가 자원을 얼마나 쓰는지 상세히 알려줘요. 이 두 가지를 도커 컴포즈 파일에 포함시켜야 해요. 설정 시 주의할 점은 에이전트들이 호스트의 시스템 정보를 읽을 수 있도록 적절한 볼륨 마운트(Volume Mount)와 권한 설정을 해주는 것이에요.
예를 들어 cAdvisor를 실행할 때는 `/sys`, `/var/lib/docker`, `/dev/disk`와 같은 경로를 읽기 전용으로 연결해줘야 정확한 컨테이너 지표를 얻을 수 있어요. 이 과정을 소홀히 하면 컨테이너의 네트워크 사용량이나 디스크 사용량이 0으로 표시되는 현상이 발생할 수 있어요.
STEP 2. 메트릭 수집을 위한 Prometheus 설정하기
수집된 데이터들을 한곳에 모아 저장할 창고가 바로 Prometheus예요. Prometheus는 데이터를 일정 주기마다 에이전트들에게 요청해서 가져오는 풀(Pull) 방식을 사용해요.
도커 컴포즈 환경에서는 Prometheus가 다른 컨테이너 서비스들을 찾을 수 있도록 네트워크(Network) 설정이 매우 중요해요. 동일한 사용자 정의 브리지 네트워크에 모든 컨테이너를 배치해야 Prometheus가 컨테이너 이름만으로도 데이터를 요청할 수 있어요. `prometheus.yml` 설정 파일에는 `static_configs` 대신 `docker_sd_configs`(Docker Service Discovery)를 사용하면, 새로운 컨테이너가 추가될 때마다 수동으로 설정 파일을 수정하지 않아도 자동으로 감지하게 만들 수 있어요.
이 단계에서 데이터 보관 주기(Retention)를 꼭 설정하세요. 테스트 단계에서는 15일 정도로 짧게 가져가더라도, 운영 단계에서는 데이터 분석을 위해 최소 15일에서 30일 이상의 보관 기간을 확보하는 것이 좋아요.
STEP 3. 시각화를 위한 Grafana 대시보드 구축하기
데이터가 아무리 많아도 눈에 보이지 않으면 소용없어요. Grafana는 Prometheus에 저장된 숫자들을 멋진 그래프와 차트로 바꿔주는 역할을 해요. 대시보드를 구성할 때는 단순히 그래프를 나열하는 것이 아니라, 상황 파악의 흐름을 고려해야 해요.
가장 추천하는 대시보드 구성 순서는 다음과 같아요.
- 상단 요약 섹션: 현재 전체 서비스의 가동 상태(Up/Down), 최근 1시간 내 에러 발생 횟수, 전체 CPU/메모리 평균 사용량
- 중단 상세 섹션: 서비스별 CPU/메모리 사용량 추이, 네트워크 트래픽 변화, 디스크 I/O 부하
- 하단 로그 섹션: 실시간 에러 로그 피드 (Loki 연동)
직접 대시보드를 만드는 것이 어렵다면, Grafana 공식 홈페이지에서 제공하는 Prometheus Node Exporter Full 같은 완성도 높은 템플릿을 가져와서 사용해 보세요. 훨씬 빠르게 수준 높은 관측 체계를 갖출 수 있어요.
STEP 4. 실시간 로그 수집과 검색 환경(Loki) 연동
메트릭이
자주 하는 실수와 해결법 및 자주 묻는 질문
모니터링 시스템을 구축하다 보면 예상치 못한 문제에 부딪히기 마련이에요. 많은 운영자가 공통적으로 겪는 실수들과 그 해결 방법을 정리해 보았어요.
자주 하는 실수와 해결법
❌ 실수: 모든 컨테이너의 로그를 무제한으로 저장함
왜 발생하는가: 로그 파일이 서버의 디스크 용량을 모두 차지하여 시스템 전체가 다운되는 현상이 발생해요.
✅ 해결법: Loki의 retention 설정이나 Docker의 log-driver 설정을 통해 로그 보관 주기와 최대 용량을 반드시 제한하세요.
❌ 실수: 모니터링 에이전트가 호스트 리소스를 너무 많이 점유함
왜 발생하는가: 수집 주기가 너무 짧거나(예: 1초 단위), 로그 파싱 규칙이 너무 복잡할 때 발생해요.
✅ 해결법: 수집 주기는 보통 15~30초 정도로 설정하고, 불필요한 레이블은 과감히 제거하여 부하를 줄이세요.
❌ 실수: 네트워크 격리로 인해 메트릭 수집 실패
왜 발생하는가: Prometheus 컨테이너와 대상 컨테이너가 서로 다른 도커 네트워크에 있을 때 통신이 안 돼요.
✅ 해결법: 도커 컴포즈 파일 내에서 하나의 공통 네트워크를 정의하고 모든 컨테이너를 해당 네트워크에 소속시키세요.
❌ 실수: 알림 임계값이 너무 낮아 ‘알림 폭탄’을 맞음
왜 발생하는가: 일시적인 네트워크 지연이나 짧은 CPU 상승에도 즉시 알림이 가도록 설정했기 때문이에요.
✅ 해결법: Prometheus의 for 구문을 활용하여, 특정 조건이 일정 시간 이상 지속될 때만 알림이 발생하도록 완충 장치를 두세요.
❌ 실수: 시계 동기화 문제로 로그 순서가 뒤섞임
왜 발생하는가: 호스트 서버와 컨테이너 간의 시간이 맞지 않으면 로그가 과거 시간으로 기록될 수 있어요.
✅ 해결법: 호스트 서버에 NTP(Network Time Protocol)를 설정하여 시스템 시간을 항상 정확하게 유지하세요.
자주 묻는 질문
Q. 도커 컴포즈 환경에서 Prometheus를 쓰는 게 정말 효율적인가요?
네, 아주 효율적이에요. 도커 컴포즈는 환경을 코드로 관리하는 특성이 있는데, Prometheus 역시 설정 파일(YAML)로 모든 것을 정의할 수 있어 인프라를 코드로 관리하는(IaC) 철학과 매우 잘 맞아요. 또한 오픈소스 생태계가 워낙 넓어서 필요한 플러그인을 찾기도 쉬워요.
Q. 모니터링 시스템 자체가 죽으면 어떻게 하나요?
이 질문은 매우 날카로운 지적이에요. 사실 완벽한 방법은 없지만, 보통은 핵심 서비스의 상태를 체크하는 아주 가벼운 외부 모니터링 서비스(예: UptimeRobot 등)를 별도로 두어, 우리 서버 전체가 살아있는지 이중으로 확인하는 방식을 사용해요.
Q. 로그를 수집할 때 성능 저하가 심하지는 않을까요?
Promtail 같은 경량 에이전트를 사용하면 일반적인 서비스 운영 환경에서는 거의 체감하기 어려워요. 하지만 로그 양이 초당 수만 건 이상 발생하는 대규모 서비스라면 로그를 압축해서 전송하거나, 중간에 메시지 큐(Kafka 등)를 두는 설계를 고려해야 해요.
Q. Grafana 대시보드는 직접 다 만들어야 하나요?
아니요, 그럴 필요 없어요. Grafana Dashboard 라이브러리에는 전 세계 전문가들이 미리 만들어둔 훌륭한 템플릿이 아주 많아요. 처음에는 템플릿을 가져다 쓰면서 우리 서비스에 맞게 조금씩 수정해 나가는 방식을 추천해요.
안정적인 운영을 위한 마지막 점검
모니터링 시스템 구축은 한 번 설정하고 끝나는 숙제가 아니라, 서비스의 성장과 함께 계속해서 다듬어 나가야 하는 과정이에요. 서비스가 커지면 관측해야 할 지표도 늘어나고, 알림의 기준도 더 정교해져야 하니까요. 오늘 배운 내용을 바탕으로 지금 바로 작은 규모부터 시작해 보세요.
- 모니터링 스택은 Prometheus + Grafana + Loki 조합을 추천해요.
- 단순 상태 확인을 넘어 CPU, 메모리, 에러율 등 다각도의 지표를 수집하세요.
- 알림은 반드시 ‘지속 시간(for)’ 조건을 넣어 알림 피로를 방지하세요.
- 로그 수집 시에는 컨테이너 레이블을 잘 활용해야 검색이 쉬워요.
- 모니터링 도구 자체의 자원 사용량과 로그 보관 주기도 관리 대상이에요.
성공적인 운영을 위한 다음 단계 가이드
- 오늘 할 일: 도커 컴포즈에 Prometheus와 Grafana를 띄워보고 기본 대시보드를 연결해 보세요.
- 이번 주 할 일: 가장 자주 발생하는 에러 로그 하나를 골라 실시간으로 모니터링되는지 확인하고, 특정 에러 발생 시 슬랙 알림이 오도록 설정해 보세요.
- 실행 직전 할 일: 알림이 왔을 때 내가 무엇을 확인해야 하는지 대응 매뉴얼(Runbook)을 한 줄이라도 적어두세요.
핵심 지표 3가지만 먼저 정하고 알림을 걸어 보세요. 그것만으로도 여러분의 밤은 훨씬 더 평온해질 거예요. 지금 바로 시작하는 것이 가장 좋은 운영의 시작입니다.
도커의 더 깊은 활용법이 궁금하다면 도커 컴포즈 기본 개념 완벽 정리 — 개념부터 실무 활용까지 한눈에 보는 가이드 글도 함께 읽어보시길 추천해요.