DevBoi

[Docker] 리눅스 용량 확보 및 도커 저장공간 최적화 본문

Infra/[K8S & Docker]

[Docker] 리눅스 용량 확보 및 도커 저장공간 최적화

HiSmith 2024. 4. 26. 01:53
반응형

EC2를 사용하다가 용량 초과로 인해 서버가 움직이질않는다.

도커가 동작할떄 기본적으로 로그를 작성하는데, 이 로그가 꽉차서 작성할수없자, 무한 대기 + 재시작 상태가 되는것이다.

 

아래와 같은 방법으로 조치 및 최적화를 진행해보자

 

1. 용량 확인

 

1-1.어디에서 많은용량을 사용하고있는지를 알아내자

 

df 로 간단하게 현재 용량이 100%라는 것을 확인 한다.

 

1-2. 어디 경로에서  많은 비중을 차지할까?

df -h

해당 어떤 디렉토리에서 사용 차지하는지 알수 있다. 나는 overlay2 하위 도커 디렉토리에서 거의 다썼다.

 

 

1-3. 어떤 파일 때매 그럴까?

해당 경로로 우선 이동하고 현재 디렉토리에서 가장 많은 비중을 차지하는 상위 5개의 리스트만 보기

du -hs * | sort -rh | head -5

 

이도해서 보니 최종적으로

/merged/usr/local/bin 하위의 node파일이 많은 비중을 차지했다.

다만 유니코드로 되어있어 식별이 불가했다.

 

따라서 이런 시스템 로그들을 클린 시켜줄 방법을 찾아야 했다.

근본적으로는 저장을 많이하지 않고, 메모리는 그대로 사용하되, 디스크사용을 적게하거나 주기적으로 삭제해야했다.

 

1,

docker prune 로 정리하자

 

overlay2폴더의 용량이 도커는 사용할 수록 거대해지고, 이는 결국 서버 과부하 및 서버 정지에 이르른다.

따라서 해당 명령어로 정리를 해줘야한다.

 

도커 하위 용량 리스트 확인

sudo bash -c 'du -sh /var/lib/docker/*'

 

미사용 관련 도커 리소스 삭제

sudo docker system prune -a -f

 

컨테이너를 중지하고 prune 를 하게 되면 미사용으로 간주되어 거의 모든 리소스가 삭제된다.

이미지도 다시 받아야 하는 단점이 있지만, 우선 문제는 없다.

 

 

해당 시점 이후에 62%까지 줄어든것을 볼 수 있다.

 

일단 아래 두가지 방법으로 서버를 살릴것이다.

 

1. 사용하는 도커 이미지의 크기를 줄이는 것도 굉장히 중요하다

백엔드 이미지 크기가 1기가 넘는다 nestJS의 이미지를 빌드할때 최소화 시키자

일단 간단하게 alpine의 이미지를 사용해서 경량화를 시키면 빠르게 가능하다. 추가로는 불필요한 디렉토리를 삭제 해주면되는데

인증서 관련 파일을 발라내기 귀찮아서 우선 이렇게 하고 끝냈다.

FROM node:18-alpine
RUN mkdir -p /var/app
WORKDIR /var/app
COPY . .
RUN npm install --legacy-peer-deps
RUN npm run build
EXPOSE 3000
CMD [ "node", "dist/main.js" ]

 

 

2.

Docker container 로그파일의 최대 크기를 구하자

사실 로그파일은 저장될 필요가 없다. 커도 그때만 보면 되기떄문이다 (휘발성 서비스가 강해서)

/etc/docker/daemon.json에 아래와 같은 파일을 생성한다.생성하고 리스타트를 한다. (파일이없다면 새로 만들면 도커가 알아서 설정파일을 들고간다)

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "1m",
    "max-file": "10",
    "labels": "production_status",
    "env": "os,customer"
  }
}

 

 

최종적으로

1.6기가에서 711MB로 이미지가 줄었고,로깅은 1M이후로는 만들지않아, 서비스가 오래 정상작동했다.

반응형