본문 바로가기
Docker

[Docker] 13. 도커 데몬 모니터링

by 별준 2021. 7. 15.

Contents

  • 도커 데몬 디버그 모드
  • events, stats, system df 명령어
  • CAdvisor

다양한 목적에 부합하는 모니터링 방법은 도커에 매우 많습니다. 제한적이지만 도커 엔진 자체가 지원하는 모니터링 기능도 있고, 도커 프로젝트에서 지원하는 상용 솔루션 및 각종 오픈소스 대시보드도 있습니다. 이번 글에서는 하나의 컨테이너 뿐만 아니라 도커 데몬 자체를 모니터링하는 방법을 알아보겠습니다.

 

1. 도커 데몬 디버그 모드

도커 데몬에서 어떤 일이 일어나고 있는지 가장 확실하고 정확하게, 그리고 자세히 알아내는 방법은 도커 데몬을 디버그 옵션으로 설정하여 실행하는 것입니다. 디버그 옵션으로 실행하면 Remote API의 입출력뿐만 아니라 로컬 도커 클라이언트에서 오가는 모든 명령어를 로그로 출력합니다. 디버그 모드는 도커 데몬을 실행할 때 -D 옵션을 추가해서 사용할 수 있습니다.

sudo dockerd -D
도커를 서비스로 구동했을 때는 디버그 모드임에도 불구하고 위와 같은 출력 내용이 없기 때문에 로그 파일에서 이를 확인할 수 있습니다. 우분투 14.04에서는 /var/log/upstart/docker.log에서 확인가능하며, systemd를 기반으로하는 CentOS와 우분투 16.04 이상에서는 journalctl -u docker 명령어로 확인할 수 있습니다.

 

디버그 모드는 도커 데몬에 문제가 생겼을 때 무엇이 잘못됬는지 확인하는 가장 좋은 수단입니다. 그러나 로그에서 원하는 않는 정보까지 너무 많이 출력되며, 호스트에 있는 파일을 읽거나 도커 데몬을 포그라운드 상태로 실행해야 하는 단점이 있어, 조금 부족해보이는 것이 사실입니다. 

 

2. events, stats, system df 명령어

2.1. events

도커를 사용하는 가장 쉬운 방법은 도커 자체가 제공하는 기능을 사용하는 것이며, events 명령어도 도커가 기본으로 제공하는 명령어입니다. events는 도커 데몬에 어떤 일이 일어나고 있는지를 실시간 스트림 로그로 보여줍니다. 아래 명령어 중의 하나를 입력하면 도커 데몬이 수행한 명령어의 결과를 실시간으로 볼 수 있습니다.

docker events
docker system events

컨테이너를 삭제하고 다시 생성했을 때의 로그입니다.

이처럼 도커 데몬에서 실행되는 명령어의 결과를 로그로 출력합니다. 다만, 도커 클라이언트에 입력하는 모든 명령어가 출력되는 것은 아니며, attach / commit / copy / create 등의 컨테이너 관련 명령어와 delete / import / load / pull / push 등의 이미지 관련 명령어, 볼륨, 네트워크, 플러그인 등에 관한 명령어의 수행 결과만 출력됩니다.

events 명령어는 filter 옵션을 사용해 원하는 정보만 출력하도록 설정할 수 있는데, 출력의 종류는 container / image / volume / network / plugin / daemon으로 나뉩니다. 특정 항목에 대한 출력 결과만 보고 싶다면 --filter 'type=...'처럼 옵션을 설정하면 됩니다.

docker events --filter 'type=image'

type뿐 아니라 특정 컨테이너와 특정 이미지로 생성된 이미지, 라벨 등으로 필터를 설정할 수도 있으며, 자세한 내용은 events 명령어 항목을 참조바랍니다.

 

2.2. stats

docker stats 명령어는 실행 중인 모든 컨테이너의 자원 사용량을 스트림으로 출력합니다. 

stats 명령어는 실행 중인 모든 컨테이너의 CPU, 메모리 제한 및 사용량, 네트워크 입출력, 블록 입출력(하드웨어 입출력) 정보를 출력합니다. 기본적으로 스트림 형태로 출력되며, 스트림이 아닌 한 번만 출력하는 방식을 원한다면 --no-stream 옵션을 추가합니다.

docker stats --no-stream

 

2.3. system df

system df 명령어는 도커에서 사용하고 있는 이미지, 컨테이너, 로컬 볼륨의 총 개수 및 사용 중인 개수, 크기, 삭제함으로써 확보 가능한 공간을 출력합니다.

 

3. CAdvisor

CAdvisor는 구글이 만든 컨테이너 모니터링 도구로, 컨테이너로서 간단히 설치할 수 있고 컨테이너별 실시간 자원 사용량 및 도커 모니터링 정보 등을 시각화해서 보여줍니다. CAdvisor는 오픈소스로서 깃허브에서 소스코드로 사용할 수 있으며, 도커 허브에서 도커 이미지로도 배포되고 있습니다.

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 \
--volume=/dev/disk/:/dev/dist:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

생성이 완료되면 호스트의 8080번 포트로 CAdvisor 대시보드에 접근할 수 있습니다. (localhost:8080으로 접근)

CAdvisor에서는 생성된 모든 컨테이너의 자원 사용량을 확인할 수 있을 뿐만 아니라 도커 데몬의 정보, 상태, 호스트의 자원 사용량까지 한 번에 확인할 수 있습니다.

 

CAdvisor가 이렇게 많은 정보를 사용자에게 보여줄 수 있는 이유는 컨테이너를 생성할 때 설정한 호스트 볼륨 공유에 있습니다. 

컨테이너를 생성할 때 정보를 가져올 수 있는 호스트의 모든 디렉토리를 CAdvisor 컨테이너의 볼륨으로서 마운트했기 때문입니다.

/var/run에는 도커를 로컬에서 제어하기 위한 유닉스 소켓이 있고, /sys에는 도커 컨테이너를 위한 cgroup 정보가 저장되어 있으며, /var/lib/docker에는 도커의 컨테이너, 이미지 등이 파일로 존재합니다.

 

/sys/fs 디렉토리에는 도커 컨테이너에게 격리된 자원을 제공하기 위한 cgroup 디렉토리가 존재합니다. 이 디렉토리에는 CPU, Memory 등 컨테이너가 격리되어 할당받아야 할 자원이 디렉토리로서 다시 존재하고, 그 하위 디렉토리에는 각 컨테이너에게 할당된 cgroup 정보가 존재합니다.

/sys/fs/cgroup/{cgroup 할당 자원}/docker/{컨테이너 ID}/...

 

그러나 CAdvisor는 단일 도커 호스트만을 모니터링할 수 있다는 한계가 있습니다. 여러 개의 호스트를 도커로 사용하고 있으며, 이를 기반으로 PaaS 같은 도커 클러스터를 구축했다면 단일 CAdvisor 컨테이너는 용도에 맞지 않을 수 있습니다.

이를 위해서 보통은 쿠버네티스나 스웜 모드 등과 같은 오케스트레이션 툴을 설치한 뒤에 프로메테우스(Prometheus), InfluxDB 등을 이용해 여러 호스트의 데이터를 수집하는 것이 일반적입니다.

 

'Docker' 카테고리의 다른 글

[Docker] 12. 스토리지 드라이버(storage driver)  (0) 2021.07.15
[Docker] 11. 도커 데몬(Daemon)  (1) 2021.07.15
[Docker] 10. Dockerfile  (0) 2021.07.15
[Docker] 09. Private Registry  (0) 2021.07.15
[Docker] 08. 도커 이미지  (0) 2021.07.14

댓글