도커 컨테이너 로깅

날짜
Sep 10, 2024
태그
docker
설명
도커 컨테이너 로깅
 

컨테이너 로깅

도커는 컨테이너의 컨테이너의 출력과 에러 로그를 별도의 메타 데이터 파일로 저장하며, 이를 확인하는 명령어를 제공해요.
 
docker run -d --name mysql \ -e MYSQL_ROOT_PASSWORD=1234 \ mysql:8.0
mysql 컨테이너를 백그라운드로 생성
 
notion image
 
 
docker logs mysql <로그의 정상적인 출력>
백그라운드로 생성한 mysql 컨테이너의 로그를 확인
notion image
 
 
docker run -d --name no_password_mysql \ mysql:8.0
패스워드 환경 변수를 설정하지 않은 채 mysql 컨테이너를 생성
notion image
 
>>> 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 <패스워드를 설정하라는 에러 메시지>
로그 파일을 실행하면 에러를 보여준다.
notion image
 
컨테이너 로그는 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
json 로그 파일의 최대 조건 설정
 
 
DOCKER_OPT = "--log-driver=syslog" DOCKER_OPT = "--log-opt max-size=10k --log-opt max-file=3"
—log-driver 옵션을 사용하여 로깅 드라이버를 변경할 수 있다.
 
 

syslog 로그

컨테이너 로그를 JSON으로만 저장하는 것이 아닌 syslog로도 전달해 저장 수 있다. 커널, 보안과 관련된 다양한 로그를 수집해 저장한다. 대부분의 유닉스 계열 운영체제의 syslog를 사용하는 인터페이스가 동일하기 때문에 더욱 로그 수집과 분석이 체계적일 수 있다는 장점이 있다.
 
>>> docker run -d --name syslog_container \ --log-driver=syslog \ ubuntu:14.04 \ echo syslogtest # syslogtest라는 문구를 출력하고 컨테이너는 종료된다.
syslog 에 로그를 저장하는 컨테이너 생성
로컬호스트에서 실행시 실패한다. 이유는 syslog드라이버가 없기 때문인 것 같다.
로컬호스트에서 실행시 실패한다. 이유는 syslog드라이버가 없기 때문인 것 같다.
ec2 ubuntu환경에서는 잘 실행된다.
ec2 ubuntu환경에서는 잘 실행된다.
 
>>> journalctl -u docker.service
로그를 확인해보니 출력이 잘 쌓여있다
notion image
 
서버 호스트: 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
notion image
 
--log-opt syslog-facility='mail' root@rsyslog:/var/log/ mail.log ....
--log-opt syslog-facility 옵션을 사용하면 rsyslog 서버 컨테이너에 해당 facility에 해당하는 로그 파일이 생성된다.
 

fluentd 로깅

 
도커 엔진의 컨테이너의 로그를 fluentd를 통해 저장할 수 있도록 플러그인을 공식적으로 제공한다. JSON 포맷의 데이터 포맷을 사용하기 때문에 쉽게 사용이 가능하고, AWS S3, HDFS(Hadoop Distributed File System), MongoDB 등 다양한 저장소에 저장할 수 있다.
 
sudo docker pull mongo:4.4
mongodb 의 구버전을 내려받는다
 
>>> sudo docker run -d --name mongoDB \ --net host \ mongo:4.4
mongoDB 컨테이너 생성
 
>>> 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
Fluentd 컨테이너 실행 시 설정 파일 마운트
# 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
fluend를 로그 드라이버로 활용할 nginx 웹서버 컨테이너를 생성
>>> docker exec -it mongoDB mongosh -> 이전 버전을 활용했으므로 mongo 사용
notion image
 
 

아마존 클라우드워치 로그

 
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
AWS CloudWatch에 로그를 전송하는 Docker 컨테이너를 생성 및 실행
 
로그가 잘 수집되었다.
로그가 잘 수집되었다.
 
 
 

댓글

guest