Docker - Logging and Monitoring

INHEES·2025년 1월 13일
post-thumbnail

금일은 컨테이너 실행가능한 host pc 에서의 docker logging 과 해당 컨테이너의 모니터링에 대해서 알아보겠습니다.

목차

  • Docker Container Logging
  • Docker Container Monitoring

Docker Container Logging

  • 도커 내부에서 발생되는 로그 메시지를 확인합니다.

    • 도커 실행 시 또는 실행 이후에 발생 되는 로그 메시지 출력이 가능하다.
    • f 옵션을 사용하게 되면 실시간으로 로그 메시지를 확인 가능합니다.
    • 로그 메시지는 지정되어 있지만 사용자가 임의로 변경 가능합니다.
    docker logs <container_id or name>
    docker logs -f <container_id or name>
  • Linux 환경에서 docker inspect 를 통해 로그 저장소는 /var/lib/docker/containers/${container_id}/${container_id}-json.log 형태로 저장되 어 있습니다.

    docker inspect <container_id> | grep LogPath
    
    sudo cat <LogPath>-json.log 
  • Linux 환경에서는 컨테이너 로그 파일 외에도 시스템에서 관리할 수 있는 syslog 도구를 활용해서 로그를 확인 가능합니다.

    해당 실습은 AWS EC2 환경에서 진행 가능합니다.

    • syslog : 유닉스 계열 운영체제에서 로그 수집하는 도구 (커널, 보안 애플리케이션 로그등)
      docker run -d -p 13306:3306 --log-driver syslog \
      -e MARIADB_ALLOW_EMPTY_ROIOT_PASSWORD=ture \
      --name mariadb1 \
      mariadb:latest
      
      docker logs <container_id> => 전체 로그 적용
      
      journalctl -u docker.service | grep <container_id> => filtering 적용
  • Windows 환경에서의 컨테이너 로그 파일 확인은 다음과 같습니다.

    • docker inspect 로는 var/lib/docker/containers/~ 의 내용은 확인이 어렵습니다.
    • var/lib/docker/containers/~ 해당 위치를 Volume mount 로 연결한 Linux Container 에서 내용 확인이 가능합니다.
        docker run -v /:/data -it ubuntu /bin/bash
        
        /# chroot /data
         cd /var/lib/docker/containers
         cd <container_id>
         cat <container_id>-json.log
         

windows 환경에서의 Syslog 활용방법

  • gui 를 잘 살릴수 있는 Visual Syslog Server 를 사용해 보겠습니다.

    아래의 링크를 통해 visualsyslog_setup.zip 파일을 압축 해제한 후 설치를 진행하시면 됩니다. 블로그 작성 기준 최신 버전은 1.6.4 입니다.

    설치가 완료되면 아래의 이미지를 볼 수 있습니다.

    Visual Syslog Server Install

  • Syslog Setup 에서의 Main 설정에서는 udp, tcp 포트를 사용하고 0.0.0.0 ip address 를 사용하여 모든 ip 를 허용합니다.
    Files 설정에서는 Log 파일이 저장되는 host Pc 의 저장소 위치를 확인 가능합니다.

  • Windows 의 환경에서 해당 컨테이너를 실행하게 되며 Syslog Server Tools 에 실시간으로 로그가 찍히는 것을 gui 로 확인 가능합니다.

    --log-opt 명령어를 통해 프로토콜과 host ip address, syslog port 번호를 적어주어야 합니다.

    docker run -d -p 13306:3306 --log-driver syslog 
    --log-opt syslog-address=udp://<host pcip address>:514 
    - e MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=ture 
    --name mariadb1 maridb:latest


실행했던 database 컨테이너 외에도 docker-compose 파일을 활용하여 backend 컨테이너도 실행하여 두가지 서비스를 실행해보겠습니다.

version: '3.7'
services:
 my-backend:
   image: edowon0623/catalog-service:syslog-ng-v1.3
   environment: 
     - spring.datasource.url=jdbc:mariadb://my-db:3306/mydb
     - spring.datasource.password=
     - DOCKER-COMPOSE-SYSLOG-ADDRESS=[ipconfig 명령어를 통해 확인 가능]
     - DOCKER-COMPOSE-SYSLOG-PORT=514
   ports:
     - 8088:8088
   depends_on:
     - my-db
   networks:
     - my-network

 my-db:
   image: mariadb:latest
   environment: 
     - MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true
     - MARIADB_DATABASE=mydb
   ports:
     - 13306:3306
   networks:
     - my-network

networks:
 my-network:
   external: true

해당 my-backend 컨테이너의 설정에서 SYSLOG-PORT, ADDRESS 는 backend service 의 logback.yml 파일의 설정과 연관되어 있습니다.

logback.yml 파일의 property name 설정을 보게 되면 ADDRESS, PORT 번호를 ${} 형식을 통해 docker-compose 의 environment 설정값을 가져오는 것입니다.

port 번호가 514 번인 이유는 windows 에 syslog 를 설치했기 때문에 컨테이너와 윈도우의 통신을 해야 하기 때문에 514 포트를 활용해야 합니다.

<configuration debug="true" scan="true" scanPeriod="30 seconds">
   <property name="SYSLOG-ADDRESS" value="${DOCKER-COMPOSE-SYSLOG-ADDRESS}"/>
   <property name="SYSLOG-PORT" value="${DOCKER-COMPOSE-SYSLOG-PORT}"/>

   <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
       <syslogHost>${SYSLOG-ADDRESS}</syslogHost>
       <facility>LOCAL0</facility>
       <port>${SYSLOG-PORT}</port>
       <throwableExcluded>true</throwableExcluded>
       <suffixPattern>catalog-service %m thread:%t priority:%p category:%c exception:%exception</suffixPattern>
   </appender>

   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <layout class="ch.qos.logback.classic.PatternLayout">
           <Pattern>
               %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
           </Pattern>
       </layout>
   </appender>

   <root level="debug">
       <appender-ref ref="STDOUT" />
       <appender-ref ref="SYSLOG" />
   </root>
</configuration>


Syslog Container 실행방법

windows 에 syslog server 프로그램을 설치할 필요없이 docker-compose 를 활용해서 db, backend, syslog 3개의 서비스를 실행하여 로그 수집 또한 가능합니다.

version: '3.7'
# services:
#   syslog-ng:
#     image: balabit/syslog-ng:latest # Use the official syslog-ng image
#     ports:
#       - "514:514/udp" # Map UDP port for syslog
#     volumes:
#       - ./syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf # Mount custom config
#     restart: unless-stopped

services:
  syslog-ng:
    image: linuxserver/syslog-ng:latest
    container_name: syslog-ng
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./syslog-ng/config:/config
      - ./syslog-ng/log:/var/log #optional
    ports:
      - 514:5514/udp
      - 601:6601/tcp
      - 6514:6514/tcp
    restart: unless-stopped
    networks:
      - my-network
    
  my-backend:
    image: edowon0623/catalog-service:syslog-ng-v1.3
    environment: 
      - spring.datasource.url=jdbc:mariadb://my-db:3306/mydb
      - spring.datasource.password=
      - DOCKER-COMPOSE-SYSLOG-ADDRESS=syslog-ng
      - DOCKER-COMPOSE-SYSLOG-PORT=5514
    ports:
      - 8088:8088
    depends_on:
      - my-db
    networks:
      - my-network

  my-db:
    platform: linux/amd64 # for apple chip
    image: mariadb:latest
    environment: 
      - MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=true
      - MARIADB_DATABASE=mydb
    ports:
      - 13306:3306
    # volumes: 
    #   - /Users/dowonlee_1/Desktop/Work/14.online/docker_examples/docker-compose/data:/var/lib/mysql # shared folder
    networks:
      - my-network

networks:
  my-network:
    external: true

docker-compose.yml 파일을 살펴보면 my-backend 의 environment 의 설정값들을 확인할 수 있는데 resources 에 작성된 application.yml 에 작성된 database 설정 파일을 override 하는 역할을 합니다.

514:5514/udp 해당 ports 설정 값의 설명을 덛붙이자면 같은 네트워크 안에 컨테이너들이 묶여 있다면 5514 포트로 아니라며 514 포트번호로 통신한다는 의미입니다.

또한 같은 네트워크에 묶여 있다면 container_name 부분을 host name 으로 부를 수 있기 때문에 ip address 설정 부분보다 간단하는 것을 알 수 있습니다.

DOCKER-COMPOSE-SYSLOG-ADDRESS=syslog-ng 부분에서는 syslog-ng 와 my-backend 가 같은 네크워크로 묶여 있기 때문에 hostname 으로 사용 가능합니다.

syslog-ng 컨테이너의 volume 설정을 보게된다면 해당 docker-compose 실행시에 설정해놓은 위치 ./syslog-ng/log host pc 안에 로그 들을 저장되는 것을 확인 가능합니다.


Docker Conatiner Monitoring

컨테이너의 Monitoring 은 컨테이너의 생명 주기가 짧고 VM 에 비해서, 여러 개의 컨테이너 관리가 필요하며 대표적인 Monitoring Tools 로는 OpenSource Prometheus 가 있습니다.

Promethues

  • 여러 컨테이너 상태를 개별적으로 추적 가는(분산 애플리케이션 모니터링 가능)
  • 컨테이너 상태에 대한 Metrics 수집 하여 외부 서비스와의 연계 (시각화 서비스와 연결)

Linux 환경

/etc/docker/daemon.json 파일의 metrics-addr 설정을 promethues 가 사용할 수 있도록 ip address, port 번호를 적어줍니다.

Windows

docker desktop -> settings -> docker engine -> configuration file 수정(metrics-addr) -> docker desktop 재실행

이를 통해 다른 마이크로 서비스에서 보내는 metrics 을 수집할 수 있습니다. 다음으로는 host ip 를 등록후에 컨테이너를 시작해 보겠습니다.

docker_host 를 등록하는 이유는 host pc 로 부터 받는 metrics 을 수집하기 위해서 이며 url 은 http://docker_host:9323/metrics 로 접속 가능합니다. 해당 port 번호는 docker engine d에 설정한 metrics-addr 의 포트번호입니다.

promethues 자체는 http://docker_host:9090 으로 접속가능합니다.

set hostIP = [Ip address] -> 사용자 변수 
docker container run -e DOCKER_HOST=%hostIP% -d --rm -p 9090:9090 diamol/promethues:2.13.1

컨테이너를 실행하게 되면 url 파라미터로 targets, metrics 를 통해 해당 지표와 상태값을 확인 가능합니다.

시각화는 Grafana 시각화 툴을 이용하는 것이 일반적이지면 Graph 옵션을 통해 간단히 볼 수 있습니다.

해당 실습 포스팅은 넘어가 보겠습니다.


참고자료

inflearn

profile
이유를 찾아보자

0개의 댓글