컨테이너 로깅
다음은 이 포스트에서 확인할 내용들입니다.
- 컨테이너 로그 스트림 소개
- 컨테이너 로그 파일의 확인
- 각 Json Map 로그 엔트리를 확인
- 중앙집중식 로깅 소개
도커 시스템 정보
다음 명령을 실행해서 Logging Driver
와 Docker Root Dir
를 확인할 수 있습니다.
$ docker system info
Logging Driver: json-file
Docker Root Dir: /var/lib/docker
도커 컨테이너의 저장소
docker ps
명령은 컨테이너의 쓰기 가능 계층에서 사용하는 디스크 공간에 대한 정보를 제공하지만, 각 컨테이너에 대해 저장된 메타데이터 및 로그 파일에 대한 정보는 저장하지 않습니다.
리눅스에서 각 도커 컨테이너의 메타데이터 및 로그 파일은 도커 데몬의 루트 디렉토리 내의 containers
디렉토리에서 얻을 수 있습니다.
$ sudo du -sh /var/lib/docker/containers/*
36K /var/lib/docker/containers/3ed3...
36K /var/lib/docker/containers/40eb...
36K /var/lib/docker/containers/939b...
36K /var/lib/docker/containers/a5ff...
36K /var/lib/docker/containers/cdda...
각 컨테이너들은 파일 시스템에서 36kB 의 공간만 차지합니다.
자세한 설명은 About storage drivers 를 참고하세요.
도커 로그 스트림(Docker Log Streams)
App 이 메시지를 stdout 에 쓰면,
도커 엔진은 이를 Json Map 형식으로 작성하고
/var/lib/docker/containers
에 컨테이너 로그를 추가됩니다.
먼저, 간단한 컨테이너를 실행합니다:
$ docker run -d busybox echo -n "Hello, Docker!"
{Container ID}
docker run
명령은 새 컨테이너를 실행하고.--detach
,-d
옵션은 백그라운드에서 실행하도록 지시합니다.
실행이 성공하면, 생성된 {Container ID} 를 출력합니다.
컨테이너 로그의 경로는 docker inspect
명령을 실행하여 확인할 수 있습니다:
$ docker inspect --format='' {Container ID}
리눅스에서 컨테이너 로그의 위치는 /var/lib/docker/containers/$CID
이고,
윈도우즈의 경우는 다음과 같습니다:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\containers
윈도우즈에서는 탐색기를 통해 접근할 수 있습니다.
만약 WSL2 에서 접근한다면, 경로/mnt/wsl/docker-desktop-data/data/docker
가
있는 지 확인하고, 없다면 다음과 같이 새로 생성한 후 마운트해야 합니다.# create missing docker sub-folder $ sudo mkdir -p /mnt/wsl/docker-desktop-data/data/docker # mount as readonly with 755 permissions $ sudo mount -t drvfs '\\wsl$\docker-desktop-data\version-pack-data\community\docker' /mnt/wsl/docker-desktop-data/data/docker -o ro,umask=022
이제 WSL2에서도
/mnt/wsl/docker-desktop-data/data/docker
경로에서
도커 결과물(Artifacts)을 확인할 수 있습니다.$ cd /mnt/wsl/docker-desktop-data/data/docker/containers/{Container ID} $ cat {Container ID}-json.log | jq { "log": "Hello, Docker!", "stream": "stdout", "time": "2021-08-20T05:56:26.3401626Z" }
쿠버네티스에서도 도커의 기본 설정을 사용하는 것이 좋습니다.
쿠버네티스를 사용할 때, 수많은 도커 호스트들이 있는데,
각 호스트마다 추가 설정없이 도커 엔진이 stdout 을 받아 Json 파일을 작성하고,
로그 로테이팅을 관리하고, 파일 시스템을 관리할 수 있기 때문입니다.
이는 아주 단순하고 효율적인 표준화된 로깅을 처리합니다.
중앙 집중식 로깅(Centralized Logging)
쿠버네티스와 같이 수많은 호스트에서 수많은 컨테이너를 실행한다면,
모든 로그를 수집하고 처리해야 할까요?
중앙집중식 로깅은 모든 분산 시스템에서 로그를 쉽게 수집하고
분석할 수 있는 한 곳에 수집하는 방법입니다.
도커가 stdout
을 수집하면 fluentd 를 사용하여 컨테이너 호스트에서 로그를 수집하고
호스트가 삭제하기 전에 외부 저장소에 전송합니다.
fluentd 는 호스트 시스템의 로그 디렉토리를 마운트하여 이 작업을 수행할 수 있습니다.
fluentd 는 플러그인 시스템을 지원하기 때문에, 로그를 어느 곳에나 보낼 수 있습니다.
marcel-dempers/docker-development-youtube-series 의 Logging 기본 데모 가 있습니다.
참고자료
- Kubernetes
- Getting Started with Logging in Kubernetes - Eduardo Silva, Treasure Data (Any Skill Level)
- Understanding Logging: Containers & Microservices
- Kubernetes Logging 101
- WINDOWS 10 LOCATION FOR DOCKER VOLUMES AND CONTAINER LOGS
- After update to 2.4.0.0 mount /mnt/wsl/docker-desktop-data/data/docker is missing
- WSL commands and launch configurations
댓글남기기