금일은 컨테이너 실행가능한 host pc 에서의 docker logging 과 해당 컨테이너의 모니터링에 대해서 알아보겠습니다.
도커 내부에서 발생되는 로그 메시지를 확인합니다.
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 환경에서 진행 가능합니다.
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
gui 를 잘 살릴수 있는 Visual Syslog Server 를 사용해 보겠습니다.
아래의 링크를 통해 visualsyslog_setup.zip 파일을 압축 해제한 후 설치를 진행하시면 됩니다. 블로그 작성 기준 최신 버전은 1.6.4 입니다.
설치가 완료되면 아래의 이미지를 볼 수 있습니다.

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>


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 안에 로그 들을 저장되는 것을 확인 가능합니다.
컨테이너의 Monitoring 은 컨테이너의 생명 주기가 짧고 VM 에 비해서, 여러 개의 컨테이너 관리가 필요하며 대표적인 Monitoring Tools 로는 OpenSource Prometheus 가 있습니다.
Promethues
/etc/docker/daemon.json 파일의 metrics-addr 설정을 promethues 가 사용할 수 있도록 ip address, port 번호를 적어줍니다.
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 옵션을 통해 간단히 볼 수 있습니다.
해당 실습 포스팅은 넘어가 보겠습니다.