2 분 소요


다음은 이 포스트에서 확인할 내용들입니다.

  • 컨테이너 로그 스트림 소개
  • 컨테이너 로그 파일의 확인
  • 각 Json Map 로그 엔트리를 확인
  • 중앙집중식 로깅 소개


도커 시스템 정보

다음 명령을 실행해서 Logging DriverDocker 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 에 쓰면,

app.writes.a.message.to.the.stdout


도커 엔진은 이를 Json Map 형식으로 작성하고

message.is.encoded.to.a.jsonmap


/var/lib/docker/containers 에 컨테이너 로그를 추가됩니다.

jsonmap.is.appended.to.the.container.log


먼저, 간단한 컨테이너를 실행합니다:

$ 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-seriesLogging 기본 데모 가 있습니다.




참고자료

댓글남기기