컨테이너 내부에서 일어나는 일들을 관리하는 것은 디버깅 뿐만 아니라 운영 측면에서도 굉장히 중요한 업무이다. 애플리케이션 레벨에서 로그가 기록되도록 개발해서 별도의 로깅 서비스를 쓸 수도 있지만, 도커는 컨테이너의 표준 출력과 에러 로그를 별도의 메타 데이터 파일로 저장해서 확인하는 기능들을 제공한다.
# docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:5.7
데몬으로 실행하고, 터미널 접속은 하지 않는다.
# docker logs mysql
# docker logs --since 14747765123 mysql // 특정 시간 이후의 로그를 확인한다
기본적으로 로그는 json 형태로 도커 낸부에 저장된다. 위치는 아래와 같다
# cat /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log
사이즈가 커지면 호스트의 저장공간에 문제가 생길 수도 있으므로 조절해줄 필요가 있다.
# docker run -it \
--logopt max-size=10k --log-opt max-file=3 \
--name log-test ubuntu:14.04
사용가능한 로그 드라이버의 예시로는 syslog, journald, fuentd. awslogs ... 여러가지 있음
# docker run -d --name syslog-container \
--logdriver=syslog \
ubuntu:14.04 \
echo syslogtest!!!
# tail /var/log/syslog
서버 : 192.168.0.100
클라이언트 : 192.168.0.101
server@192.168.0.100# docker run -it \
-h rsyslog \
--name rsyslog-server \
-p 514:514 -p 514:514/udp \
ubuntu:14.04
이후 rsyslog.conf에서 UDP 로그 설정을 주석 해제해주고, rsyslog 데몬을 재시작 해준다.
client@192.169.0.101# docker run -it \
--log-driver=syslog \
--log-opt syslog-address=tcp://192.168.0.100:514 \
--log-opt tag="mylog" \
ubuntu:14.04
이후 클라이언트에서 echo로 테스트를 진행해보면 tcp, udp 등의 통신을 이용해 로그전용 컨테이너에 태그가 붙어서 로그가 기록 된 것을 확인 할 수 있다.
syslog-facility 옵션을 이용하면 특정 상황에 대한 로그만 전달되기도 한다.
fluentd는 각종 로그를 수집하고 저장할 수 있는 기능을 제공하는 오픈소스 도구로서, 도커 엔진의 컨테이너의 로그를 fluentd를 통해 저장할 수 있도록 플러그인을 공식적으로 제공한다. JSON으로 저장되며 동시에 AWS, HDF, mongo 등 다양한 저장소에 저장할 수 있도록 해주는 장점이 있다.
도커서버들... -> fluentd -> MongoDB 와 같이 구성이 가능하다.
자세한 예제는 생략하도록 하겠다. (위와 유사하고 다만 fluntd 컨테이너에서 fluent.conf 파일 수정필요)
설정파일 암기는 리눅스마스터 자격증 취득과정에서 질려버린 관계로 매번 꼼꼼하게 확인 후 직접 작성하는거로..
AWS에서는 로그 및 이벤트 등을 수집하고 저장해서 시각적으로 보여주는 클라우드워치를 제공한다. 도커를 AWS EC2에서 사용하고 있다면 다른도구를 별도로 설치할 필요 없이 컨테이너에서 드라이버 옵션을 설정하는 것만으로도 클라우드 워치 로깅 드라이버를 사용할 수 있다. 순서는 아래와 같다.
(1) 클라우드워치에 해당하는 IAM 생성
(2) 로그 그룹 생성
(3) 로그 그룹에 로그스트림 생성
(4) 클라우드워치의 IAM 권한을 사용할 수 있는 EC2 인스턴스 생성 및 로그 기록 시작