STDOUT / STDERR
Docker container log는 stdout, stderr, streams로 Log를 찍는다.
- 기본적으로 이러한 log는 Docker host에 JSON file로 저장된다.
- Default logging driver로 json-file logging driver를 사용하기 때문이다.
로그 확인
전체 로그 확인
$ docker logs [container]
마지막 로그 10줄 확인
$ docker logs --tail 10 [container]
실시간 로그 스트림 확인
$ docker logs -f [container]
로그마다 타임스탬프 표시
$ docker logs -f -t [container]
호스트 운영체제의 로그 저장 경로
- log driver = json-file 인 경우에만 유효
로그 파일 경로
$ cat /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log
로그 파일 찾기
# 권한이 필요하기 때문에 슈퍼유저로 변경 후 진행
$ sudo su
$ find /var/lib/docker -name "*json.log" 2>/dev/null | xargs -I / cat /
OR
$ find /var/lib/docker -name "*json.log" 2>/dev/null -exec sh -c "cat {}" \;
... 생략 ...
{"log":"2023/05/08 08:51:21 [notice] 1#1: start worker process 19\r\n","stream":"stdout","time":"2023-05-08T08:51:21.969915631Z"}
실행 중인 특정 컨테이너의 log 위치를 알고싶다면, docker inspect
명령어를 사용하면 된다.
$ docker inspect <container_id> --format {% raw %} "{{.LogPath}}" {% endraw %}
일반 계정도 로그 파일 읽을 수 있도록 설정하기
도커 디렉토리(/var/lib/docker
)의 경우 root
권한만 접근할 수 있도록 설정되어 있기 때문에,
일반 계정으로 접근하려면 root
계정으로 변경하거나 일반 계정에 sudo
와 같은 권한이 부여되어 있어야 한다.
필자의 경우 컨테이너 데이터를 백업하기 위해서 /var/lib/docker
경로에 접근할 수가 있어야 하는데
여기서는 root
권한이 아닌 다른 방법을 사용하여 일반 계정도 해당 디렉토리에 접근할 수 있도록 해보려고 한다.
먼저 /var/lib/docker
의 소유권을 확인해주자.
ls -ld /var/lib/docker
drwxr-x--- 12 root root 4096 Dec 24 14:13 /var/lib/docker
여기서 그룹 소유권이 root
로 되어 있을거다.
아래 명령어를 실행해 그룹 소유권을 root
가 아닌 docker
로 변경해주자.
sudo chown -R :docker /var/lib/docker
그리고 현재 계정(유저)를 docker
그룹에 소속시켜주면 된다.
sudo usermod -aG docker $USER
그리고 보면 /var/lib/docker
디렉토리의 권한을 보면
drwx--x--- 12 root root 4096 Dec 24 14:13 /var/lib/docker
그룹 권한에서 x
(실행) 권한만 들어가 있는데 여기에 r
(읽기) 권한을 추가해주도록 하자.
sudo chmod -R g+r /var/lib/docker
이렇게 하면 docker
그룹에 속한 유저들도 /var/lib/docker
하위에 있는 파일, 디렉토리들에 정상 접근이 가능해질거다.
로그 용량 제한
- 컨테이너 단위로 로그 용량 제한을 할 수 있지만, 도커 엔진에서 기본 설정을 진행할 수도 있다.
- 운영환경(production)에서 필수 설정
한 로그 파일당 최대 크기를 3Mb로 제한하고, 최대 로그 파일 3개로 로테이팅
$ docker run -d -it --name nginx -p 80:80 --rm \
--log-driver=json-file \
--log-opt max-size=3m \
--log-opt max-file=5 \
nginx:latest