컨테이너 로깅
도커는 컨테이너의 컨테이너의 출력과 에러 로그를 별도의 메타 데이터 파일로 저장하며, 이를 확인하는 명령어를 제공해요.
docker run -d --name mysql \ -e MYSQL_ROOT_PASSWORD=1234 \ mysql:8.0
docker logs mysql <로그의 정상적인 출력>
docker run -d --name no_password_mysql \ mysql:8.0
>>> docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}" CONTAINER STATUS PORTS NAMES e2asfkj23 Up 5 minutes 3306/tcp mysql >>> docker start no_password_mysql >>> docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}" CONTAINER STATUS PORTS NAMES e2asfkj23 Up 5 minutes 3306/tcp mysql
docker logs mysql <패스워드를 설정하라는 에러 메시지>
컨테이너 로그는 JSON 형태로 도커 내부에 저장됩니다. 컨테이너 내부 출력이 많은 경우는 저장 공간을 계속 사용할 수도 있는 손실이 일어날 수 있다.
>>> docker run -it --name logtest ubuntu:14.04 >>> echo test! >>> docker logs logtest
cat /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log
>>> docker run -it \ --log-opt max-size=10k --log-opt max-file=3 \ --name log_test ubuntu:14.04
DOCKER_OPT = "--log-driver=syslog" DOCKER_OPT = "--log-opt max-size=10k --log-opt max-file=3"
syslog 로그
컨테이너 로그를 JSON으로만 저장하는 것이 아닌 syslog로도 전달해 저장 수 있다. 커널, 보안과 관련된 다양한 로그를 수집해 저장한다. 대부분의 유닉스 계열 운영체제의 syslog를 사용하는 인터페이스가 동일하기 때문에 더욱 로그 수집과 분석이 체계적일 수 있다는 장점이 있다.
>>> docker run -d --name syslog_container \ --log-driver=syslog \ ubuntu:14.04 \ echo syslogtest # syslogtest라는 문구를 출력하고 컨테이너는 종료된다.
>>> journalctl -u docker.service
서버 호스트: 192.168.65.254 클라이언트 호스트: 192.168.0.189
>>> docker run -i -t \ -h rsylog \ # 호스트 네임을 rsylog로 설정 --name rsyslog_server \ -p 514:514 -p 514:514/udp \ # 호스트 514 포트로 들어오는 TCP 트래픽이 컨테이너 514번 포트로 전달된다. ubuntu:14.04
# vi /etc/rsyslog.conf <514 포트의 주석을 해제>
>>> service rsyslog restart
>>> docker run -it \ --log-driver=syslog \ # 로그 드라이버로 syslog를 사용 --log-opt syslog-address=tcp://192.168.65.254:514 \ # 로그를 보낼 syslog 서버의 ip 주소와 포트번호, 192.168.65.254는 Docker 호스트 IP, syslog 서버가 이 IP에서 TCP 포트 514를 통해 로그를 수신. --log-opt tag="mylog" \ # mylog 라는 식별 태그를 추가 ubuntu:14.04
--log-opt syslog-facility='mail' root@rsyslog:/var/log/ mail.log ....
fluentd 로깅
도커 엔진의 컨테이너의 로그를 fluentd를 통해 저장할 수 있도록 플러그인을 공식적으로 제공한다. JSON 포맷의 데이터 포맷을 사용하기 때문에 쉽게 사용이 가능하고, AWS S3, HDFS(Hadoop Distributed File System), MongoDB 등 다양한 저장소에 저장할 수 있다.
sudo docker pull mongo:4.4
>>> sudo docker run -d --name mongoDB \ --net host \ mongo:4.4
>>> sudo mkdir -p /etc/fluentd >>> sudo vim /etc/fluentd/fluent.conf ` <source> @type forward </source> <match docker.**> @type mongo database nginx collection access host 127.0.0.1 port 27017 flush_interval 10s </match> `
>>> sudo docker run -d --name fluentd \ --net host \ -v /etc/fluentd/fluent.conf:/fluentd/etc/fluent.conf \ -e FLUENTD_CONF=fluent.conf \ alicek106/fluentd:mongo
# Nginx에서 발생한 로그는 Fluentd 서버로 전송
>>> sudo docker run -d --name nginx \ --net host \ --log-driver=fluentd \ --log-opt fluentd-address=127.0.0.1:24224 \ --log-opt tag=docker.nginx.webserver \ nginx
>>> docker exec -it mongoDB mongosh -> 이전 버전을 활용했으므로 mongo 사용
아마존 클라우드워치 로그
AWS IAM에서 로그 그룹과 로그 스트림을 생성, 생성시 ec2 서비스에 대한 cloudwatchFullAccess 권한을 추가했다.
>>> sudo docker run -it \ > --log-driver=awslogs \ > --log-opt awslogs-region=ap-northeast-2 \ > --log-opt awslogs-group=mylogs \ > --log-opt awslogs-stream=mylogstream \ > ubuntu:14.04 root@80ccbc97e345:/# echo test! test! root@80ccbc97e345:/# exit
댓글