도커를 실행하면 기본적으로 모든 stdout, stderr에 대한 출력 값을 볼 수 있습니다.
$ docker logs [Container ID]
를 입력하면, 도커에서 실행된 모든 stdout, stderr를 확인할 수 있습니다.
1. syslog
syslog는 유닉스/리눅스의 로그 정보를 담고 있는 파일입니다.
도커 log는 --log-driver=syslog 명령어를 사용해서 Host의 syslog로 전송이 가능 합니다.
$ docker run -it --log-driver=syslog ubuntu
root# echo hwani
그 후 컨테이너를 빠져나와서 Host의 syslog를 확인해보면 hwani라는 단어가 찍힌 것을 확인할 수 있습니다.
# cat /var/log/messages | grep hwani
Mar 20 12:24:47 ip-172-31-11-2 3be8b7f52574[3871]: hwani
저는 Amazon linux2에서 실행했기 때문에, messages라는 곳에 저장되었습니다. ubuntu는 syslog에 저장될 것입니다.
2. rsyslog
rsyslog는 Linux에서 널리 사용되고 있는 로깅 서비스중 하나입니다.
기존 알파인 리눅스의 ubuntu로 테스트를 해보려고 했으나, rsyslog가 구동조차 하지 않아서,
https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine
rsyslog/syslog_appliance_alpine가 설치된 docker를 받아서 실행했습니다.
rsyslog서버
$ docker run -it -p514:514 -p514:514/udp -d rsyslog/syslog_appliance_alpine
$ docker inspect cfe5 | grep -i ipaddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
log전송은 기본적으로 514포트를 사용하기 때문에 514포트를 열어줍니다.
해당 rsyslog의 ip주소를 확인 후 클라이언트를 생성합니다.
rsyslog클라이언트
$ docker run -it \
--log-driver=syslog \
--log-opt syslog-address=tcp://172.17.0.3 \
--log-opt tag="hwani" \
ubuntu
root@0de6471194ce:/ echo "seifzsjelfs"
seifzsjelfs
root@0de6471194ce:/ echo "hwani
> "
hwani
root@0de6471194ce:/ exit
그 후 rsyslog서버에 들어가서 log를 확인해줍니다.
$ docker exec -it cfe5 /bin/sh
/home/appliance:/ cd /logs/hosts
/logs/hosts:/ ls
cfe5709555b1 ip-172-17-0-1.ap-northeast-2.compute.internal
/logs/hosts:/ cd ip-172-17-0-1.ap-northeast-2.compute.internal/
/logs/hosts/ip-172-17-0-1.ap-northeast-2.compute.internal:/ ls
messages.log
/logs/hosts/ip-172-17-0-1.ap-northeast-2.compute.internal:/ cat messages.log
2023-03-20T15:38:54+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004h#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# #015#033[K#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# echo "seifzsjelfs"#015
2023-03-20T15:38:54+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015seifzsjelfs#015
2023-03-20T15:38:56+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004h#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# echo "hjw#010 #010#010 #010wani#015
2023-03-20T15:38:57+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015#033[?2004h> "#015
2023-03-20T15:38:57+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015hwani#015
2023-03-20T15:38:57+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #015
2023-03-20T15:38:59+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004h#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# exit#015
2023-03-20T15:38:59+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015exit#015
로그를 보면 클라이언트에서 했던 모든 행위들이 기록되어 있는 것을 확인할 수 있습니다.
(엔터, 특수문자 같은 것들이 #00의 숫자형태로 나타나는 것 같습니다. 가독성이 그렇게 좋아보이진 않네요.)
그리고 해당 이미지는 Docker volume설정이 되어 있어서 Host에서도 확인이 가능 합니다.
$ docker inspect cfe --format '{{json .Mounts}}' | jq
[
{
"Type": "volume",
"Name": "5e3a85ca8aebf0033dc4fa4dd69b13c9c41038d387f5ea9f8a24b46360a4007c",
"Source": "/var/lib/docker/volumes/5e3a85ca8aebf0033dc4fa4dd69b13c9c41038d387f5ea9f8a24b46360a4007c/_data",
"Destination": "/config",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "00bec34911319db0ba514671d240065393aa2ea948080bc59f3acaeb8e9298ba",
"Source": "/var/lib/docker/volumes/00bec34911319db0ba514671d240065393aa2ea948080bc59f3acaeb8e9298ba/_data",
"Destination": "/logs",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "9dbfd9933452d0d8554738793461ced4101f79e88ba7666d2d9e32d13041f8d3",
"Source": "/var/lib/docker/volumes/9dbfd9933452d0d8554738793461ced4101f79e88ba7666d2d9e32d13041f8d3/_data",
"Destination": "/work",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
$ cd /var/lib/docker/volumes/00bec34911319db0ba514671d240065393aa2ea948080bc59f3acaeb8e9298ba/_data
$ ls
debug hosts
3. 그 외 옵션들
도커 log는 기본적으로 json형태로 저장되게 됩니다. 그리고 계속 log를 append하는 형태로 기록이 됩니다.
이 log들은 결국 disk 용량을 계속 차지하게 되고, 제대로 관리를 안해준다면 결국 Container는 터지게 될 것입니다.
이럴때 로그 용량의 최대치를 정하고 그 이상되면 로그 용량을 오래된 것부터 지워나갈 수 있습니다.
- --log-opt max-size=10k : 로그 파일의 최대 크기를 10kb로 정합니다. 해당 크기를 초과하면 새로운 log파일을 생성합니다.
- --log-opt max-file=5 : 로그의 최대 파일 갯수입니다. 만약 저 옵션에서 5개가 넘어간다면, 가장 오래된 파일을 지우고 새로운 파일을 생성합니다.
- 그 외 awslogs, gcplogs, fluentd 등을 사용할 수 있습니다.
도커 로그 옵션에 대한 것들은 여기에 있습니다.
https://docs.docker.com/config/containers/logging/configure/
'프로그래밍 > 도커' 카테고리의 다른 글
Ubuntu Docker Image로 docker in docker 만들기 (0) | 2023.04.01 |
---|---|
도커 Images size total은 실제 용량과 같을까? (0) | 2023.03.30 |
도커의 네트워크 (브릿지, 호스트, 논) (0) | 2023.03.14 |
도커의 Image layer (0) | 2023.03.13 |
도커 볼륨/마운트 설명과 차이점. (0) | 2023.03.12 |
댓글