안녕하세요 펭귄 교수입니다.
도커 컨테이너를 사용하면서 중요한 부분 중 하나가 모니터링입니다.
컨테이너가 제대로 작동하고 있는지, 리소스 사용량은 적절한지, 혹시 발생하는 에러는 없는지 등을 주기적으로 모니터링하는 것은 시스템 안정성을 유지하고 문제를 조기에 발견하는 데 매우 중요합니다.
이번 포스팅에서는 도커 컨테이너 모니터링의 필요성과 이를 구현할 수 있는 다양한 도구와 방법을 소개하겠습니다.
1. 도커 컨테이너 모니터링의 필요성
도커 컨테이너는 경량화된 애플리케이션 환경을 제공하여 효율적인 배포와 관리가 가능합니다. 하지만, 애플리케이션이 여러 개의 컨테이너로 분리되면 각 컨테이너의 상태를 실시간으로 모니터링하는 것이 매우 중요해집니다.
모니터링을 통해 얻을 수 있는 이점은 다음과 같습니다:
- 리소스 사용량 파악: CPU, 메모리, 네트워크 사용량을 모니터링하면 병목 현상을 찾아내거나 리소스 부족 문제를 미리 감지할 수 있습니다.
- 문제 조기 발견: 컨테이너의 로그와 메트릭을 통해 발생하는 오류나 예외 상황을 빠르게 확인할 수 있습니다.
- 안정성 보장: 실시간 모니터링을 통해 문제가 발생하기 전에 시스템을 유지 보수하거나 자동 복구 기능을 설정할 수 있습니다.
2. 기본 도커 명령어를 이용한 모니터링
도커는 자체적으로 간단한 모니터링 명령어를 제공하며, 이를 통해 컨테이너의 기본적인 상태와 리소스 사용량을 확인할 수 있습니다.
2-1. docker stats
docker stats 명령어는 실행 중인 모든 컨테이너의 실시간 리소스 사용량을 표시합니다. CPU, 메모리, 네트워크, 블록 IO 등의 정보를 확인할 수 있습니다.
docker stats
출력 예시는 다음과 같습니다:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
f1c4e26a1127 my-container 0.50% 100MiB / 500MiB 20.00% 1.2kB / 2kB 1MB / 1MB 5
이 명령어는 컨테이너의 리소스 상태를 실시간으로 보여주며, 사용량이 지나치게 높은 컨테이너를 파악할 수 있습니다.
2-2. docker logs
docker logs 명령어를 사용하면 컨테이너 내부에서 발생한 로그를 실시간으로 확인할 수 있습니다. 애플리케이션에서 발생한 에러나 경고를 추적할 수 있습니다.
docker logs my-container
- f 플래그를 사용하여 실시간으로 로그를 추적할 수도 있습니다.
docker logs -f my-container
3. 외부 모니터링 도구를 이용한 컨테이너 모니터링
기본적인 도커 명령어로는 실시간 모니터링이나 복잡한 인프라를 관리하는 데 한계가 있습니다. 따라서 전문적인 모니터링 도구를 사용하여 더 정밀한 데이터를 수집하고, 시각화하며, 알림을 설정할 수 있습니다.
3-1. Prometheus & Grafana
Prometheus는 강력한 모니터링 및 경고 시스템으로, 도커와 연동하여 각종 메트릭을 수집할 수 있습니다. 수집된 메트릭은 Grafana를 통해 시각화할 수 있습니다.
3-1-1. Prometheus 설정
우선, Prometheus의 prometheus.yml 설정 파일을 다음과 같이 작성합니다.
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['localhost:9323']
이 설정 파일은 localhost:9323 포트에서 도커 메트릭을 수집하도록 구성한 예시입니다. 도커 메트릭을 수집하려면 docker-container-exporter와 같은 Prometheus exporter를 설치해야 합니다.
참조 : https://hub.docker.com/r/prom/prometheus
3-1-2. Grafana 대시보드
Prometheus로 수집한 데이터를 Grafana에서 시각화할 수 있습니다. Grafana는 다양한 대시보드를 제공하며, 도커 컨테이너의 상태, 리소스 사용량, 네트워크 트래픽 등을 그래프로 보여줄 수 있습니다.
다음은 Grafana 대시보드를 설정하는 예입니다.
- Grafana 설치 후 localhost:3000에 접속합니다.
- Prometheus를 데이터 소스로 추가합니다.
- 새로운 대시보드를 생성하고, CPU, 메모리, 네트워크 등 다양한 메트릭을 시각화합니다.
참조 : https://hub.docker.com/r/grafana/grafana
3-2. cAdvisor
cAdvisor는 도커 컨테이너의 리소스 사용량을 실시간으로 모니터링할 수 있는 도구입니다. cAdvisor는 간편하게 컨테이너의 CPU, 메모리, 네트워크 사용량을 확인하고, 이를 그래픽으로 시각화합니다.
참조 : https://hub.docker.com/r/google/cadvisor
3-2-1. cAdvisor 설치
cAdvisor를 도커 컨테이너로 실행할 수 있습니다.
docker run \\
--volume=/:/rootfs:ro \\
--volume=/var/run:/var/run:ro \\
--volume=/sys:/sys:ro \\
--volume=/var/lib/docker/:/var/lib/docker:ro \\
--publish=8080:8080 \\
--detach=true \\
--name=cadvisor \\
google/cadvisor:latest
위 명령어를 실행하면 localhost:8080에서 cAdvisor 대시보드를 확인할 수 있습니다.
3-2-2. cAdvisor 모니터링 예시
cAdvisor 대시보드는 CPU, 메모리, 네트워크 사용량을 실시간으로 표시하며, 각각의 도커 컨테이너에 대한 세부적인 정보를 제공합니다.
3-3. ELK Stack (Elasticsearch, Logstash, Kibana)
ELK Stack은 로그와 메트릭 데이터를 수집하고 분석할 수 있는 도구입니다. 도커 로그를 수집하여 실시간 분석하거나, 저장하여 이후 분석에 사용할 수 있습니다.
3-3-1. Logstash 설정
Logstash를 사용하여 도커 로그를 수집할 수 있습니다. 다음은 Logstash의 설정 예시입니다.
input {
docker {
endpoint => "unix:///var/run/docker.sock"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "docker-logs"
}
}
이 설정 파일은 도커 컨테이너의 로그를 수집하여 Elasticsearch에 저장하는 예입니다.
3-3-2. Kibana 대시보드
수집된 로그 데이터를 Kibana에서 시각화하여, 실시간 로그 모니터링과 분석을 할 수 있습니다. Kibana를 통해 필터링, 검색, 분석 기능을 활용해 애플리케이션의 문제를 빠르게 파악할 수 있습니다.
4. 도커 스웜과 쿠버네티스에서의 모니터링
단일 컨테이너보다는 더 복잡한 환경에서 모니터링을 해야 할 때, 도커 스웜이나 쿠버네티스와 같은 오케스트레이션 도구를 사용하여 대규모 컨테이너 클러스터를 관리합니다. 이 경우에도 Prometheus, Grafana, ELK 스택을 사용하여 모니터링할 수 있지만, 스웜과 쿠버네티스는 추가적인 모니터링 기능을 내장하고 있습니다.
4-1. 도커 스웜 모니터링
도커 스웜은 docker service ls와 같은 명령어를 통해 서비스 상태를 확인할 수 있습니다. 또한 스웜 모드에서는 여러 노드에 분산된 컨테이너를 모니터링할 수 있으며, 각 서비스의 상태와 복제본 수를 자동으로 조정할 수 있습니다.
4-2. 쿠버네티스 모니터링
쿠버네티스(Kubernetes)는 더 복잡한 클러스터 환경에서 컨테이너를 관리하는데, 내장된 모니터링 도구인 kube-state-metrics와 Heapster를 사용하여 클러스터의 상태를 모니터링할 수 있습니다. 또한, 쿠버네티스와 Prometheus, Grafana를 통합하여 더 심층적인 모니터링을 할 수 있습니다.
자세한 사항은 쿠버네티스 공식 홈페이지를 보시는 걸 추천드립니다.
5. 마무리
컨테이너 기반의 애플리케이션은 확장성과 유연성이 뛰어나지만, 제대로 운영되기 위해서는 모니터링이 필수입니다.
기본적인 도커 명령어에서부터 Prometheus, Grafana, ELK Stack 같은 전문 도구까지 다양한 모니터링 방법을 사용하여 안정적인 운영을 보장할 수 있습니다.
'Docker > Docker 강의' 카테고리의 다른 글
[Docker 강의 17편] 도커와 CI/CD 파이프 라인 (0) | 2024.10.02 |
---|---|
[Docker 강의 16편] 도커 로그 관리 (0) | 2024.10.01 |
[Docker 강의 14편] 도커 컨테이너 자동화 (0) | 2024.09.30 |
[Docker 강의 13편] 도커로 개발 환경 설정하기 (0) | 2024.09.29 |
[Docker 강의 12편] 도커 컨테이너와 포트 포워딩 (0) | 2024.09.29 |