난 그동안 왜 아무것도 안건들이고있는 서버가 꺼질까 생각했다..
바로 도커 로그때문이었다..
로그는 계속 저장될텐데 그 로그들을 관리하는 조치 해주지 않았기때문에 쌓이기만 했고 그래서 용량이 차서 자꾸 죽은거였다...
그래서 도커 로그를 관리할 방법을 찾아보니 docker-compose.yml로 관리를 해줄 수 있었다.
docker-compose.yml은 여러 개의 Docker 컨테이너를 정의하고, 이러한 컨테이너 간의 관계를 설정하며, 각 컨테이너가 사용할 설정을 정의하는 역할을 한다. 여러개의 도커 컨테이너들을 이 파일 하나의 설정으로 모두 관리할 수 있는 파일이다.
이 파일에서 볼륨 정의는 물론 환경변수 정의도 할 수 있기에 git의 secrets으로 올려둔 환경변수들을 이참에 docker-compose로 관리하기로 했다.
(docker run 명령어를 실행할 때 하나하나 -e 로 주입해주다보니 환경변수가 많아서 오타를 찾기도 어렵고, 관리가 어렵다고 느끼고있었다.)
이 글에서는 로그 출력을 위한 설정에 관한 내용만 작성하겠다.
로컬에서는 콘솔로 확인하거나 저장되는 파일로 확인하면 됐었는데, 나는 ec2에서 서버를 띄우고 있었기 때문에 로그 확인이 어려웠다.
그래서 EC2에 도커를 통해 서버를 올리고, 로깅 프레임워크로 Logback을 사용하는 방법을 사용했다.
아무것도 설정하지 않았다면, ec2에서 docker logs {컨테이너 이름} 을 통해 로그를 확인할 수 있다.
또한, 기본으로
/var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log
경로에서 쌓인 로그들을 확인할 수 있다.
표준 출력 형태가 아닌 파일로 로그를 저장해주려고 Spring logback 을 적용 시킨다.
나는 Logfj의 성능을 더 개선시키고 Slf4j도 지원하도록 개발하여 더 향상된 기능을 지원한다고하고, 관련 예제가 더 많아고 생각해 logback을 사용했다.
Spring Logback 적용 참고 링크
위 블로그 글을 참고하여 적용시켰다.
도커 볼륨 설정을 하지 않았다면 컨테이너 내부에만 로그가 남아있게된다.
도커에서 제공하는 볼륨 기능을 활용해 로그 파일을 보존할 수 있는데,
docker volume create --name server-log
위 명령어로 볼륨을 생성할 수 있다. server-log 라는 이름으로 설정해줬다.
이제 docker-compose 파일을 작성해준다.
version: '3'
services:
web:
build:
context: .
dockerfile: ./Dockerfile
container_name: server
image: "${DOCKER_HUB_USERNAME}/celebee-server:v3"
ports:
- 8080:8080
environment:
- AWS_ACCESS_KEY=${AWS_ACCESS_KEY}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- DOCKER_HUB_PASSWORD=${DOCKER_HUB_PASSWORD}
- DOCKER_HUB_USERNAME=${DOCKER_HUB_USERNAME}
- JWT_SECRET_KEY=${JWT_SECRET_KEY}
- MYSQL_DATABASE_PASSWORD=${MYSQL_DATABASE_PASSWORD}
- MYSQL_DATABASE_URL=${MYSQL_DATABASE_URL}
- MYSQL_DATABASE_USERNAME=${MYSQL_DATABASE_USERNAME}
- KAKAO_CLIENT_ID=${KAKAO_CLIENT_ID}
- KAKAO_CLIENT_SECRET=${KAKAO_CLIENT_SECRET}
- MAIL_USERNAME=${MAIL_USERNAME}
- MAIL_PASSWORD=${MAIL_PASSWORD}
volumes:
- server-log:/celebee/log
volumes:
server-log:
external: true
사용하는 환경변수들도 .env 파일로 관리해주기 위해 docker-compose에서 environment 부분에 환경변수들을 작성해줬다.
컨테이너 명 뒤에 v3은 생성한 이미지들을 버전별로 관리해주기 위해 붙였다.
외부에서 생성한 볼륨을 이용하기 위해서는 마지막에 external: true 옵션을 적어주어야 한다. 안그러면 도커 컴포즈는 매번 새로운 볼륨을 생성한다고한다.
docker volume inspect server-log
위 명령어로 볼륨이 생성된 위치를 알 수 있다.
이제 도커 로그를 영속적으로 보관할 수 있게 되었다.
또한 도커 로그 회전을 설정해주었다.
도커 로그 회전이란 로그 파일이 너무 커서 디스크 공간을 낭비하지 않게 하거나, 오래된 로그를 정리해서 관리할 수 있도록 해주는 기능이다.
도커 회전을 설정해주려면 도커 데몬 구성 파일에서 해주면 된다.
/etc/docker/daemon.json
여기 경로에서 해주면 되고, 없으면 생성해서 작성해준다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "8m",
"max-file": "3",
"compress": "true"
}
}
파일에 위와같이 내용을 작성해주면 된다.
max-size 에는 KB, MB, GB로 크기를 지정해줄 수 있고 나는 8메가바이트로 설정해줬다.
max-file은 보관되는 로그 파일의 최대 개수를 지정해주는데 우선 나는 3개로 지정해줬고,
compress는 로그 파일을 압축할지를 지정해주는 것이다.
파일을 작성했으면 도커 데몬을 재시작해줘야한다.
sudo systemctl restart docker
다시 프로젝트 컨테이너를 재시작해줘서 설정을 마쳤다.
나는 git action을 통해서 CI/CD 를 해주는데, docker run이 아니라 docker-compose up을 해주기위해 추가 설정이 필요했다.
이 부분은 다음 게시글에 작성하도록 하겠다.
reference
https://yeongunheo.tistory.com/m/entry/Springboot-Logback-%ED%8C%8C%EC%9D%BC%EA%B3%BC-Docker-%EB%B3%BC%EB%A5%A8-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0
https://velog.io/@roycewon/Spring-boot-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81Prometheus-Grafana-docker
https://yeongunheo.tistory.com/entry/Springboot-Logback-%ED%8C%8C%EC%9D%BC%EA%B3%BC-Docker-%EB%B3%BC%EB%A5%A8-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0