Docker가 차지하는 디스크 공간 정리
이점:
적어도 1년 넘게 Docker는 안정적이어서 아무런 문제가 없었다.그러나 디스크 공간이 비교적 소모되는 큰 문제가 있다.
만약 Docker가 조심하지 않아 디스크 공간을 가득 채우면 당신의 서비스도 끝난 셈이기 때문에 모든 Docker 사용자들은 이것에 대해 경각심을 가져야 한다.물론 여러분도 긴장하지 마세요. 이 문제는 그래도 잘 해결됐어요.
1. docker system 명령
누가 디스크를 다 썼습니까?Docker System 명령 상해에서 디스크 공간을 관리하는 데 사용할 수 있는 docker system 명령을 상세하게 소개했습니다.
docker system df 명령, Docker의 디스크 사용량을 보는 데 사용되는 Linux의 df 명령과 유사합니다.
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 147 36 7.204GB 3.887GB (53%)
Containers 37 10 104.8MB 102.6MB (97%)
Local Volumes 3 3 1.421GB 0B (0%)
Build Cache 0B 0B
Docker 거울은 7.2GB 디스크를 차지하고 Docker 용기는 104.8MB 디스크를 차지하며 Docker 데이터 볼륨은 1.4GB 디스크를 차지한다는 것을 알 수 있다.
docker system prune 명령은 디스크를 정리하고 닫힌 용기, 쓸모없는 데이터 볼륨, 네트워크,dangling 렌즈 (즉 태그가 없는 렌즈) 를 삭제하는 데 사용됩니다.docker system prune -a 명령은 컨테이너 없이 Docker 미러를 제거할 수 있도록 보다 철저하게 정리됩니다.이 두 명령은 당신이 잠시 닫은 용기와 잠시 사용하지 않은 Docker 렌즈를 삭제할 것입니다.그래서 사용하기 전에 꼭 생각해야 해요.
docker system prune -a 명령을 실행하면 Docker가 차지하는 디스크 공간이 크게 줄어듭니다.
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 10 2.271GB 630.7MB (27%)
Containers 10 10 2.211MB 0B (0%)
Local Volumes 3 3 1.421GB 0B (0%)
Build Cache 0B 0B
2. Docker 미러/컨테이너/데이터 볼륨을 수동으로 정리
구 버전의 Docker(버전 1.13 이전)에는 Docker 시스템 명령이 없기 때문에 수동으로 정리해야 합니다.닫힌 용기를 모두 삭제하는 데 자주 사용하는 명령을 몇 개 줍니다.
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
모든 dangling 미러를 제거합니다(예: tag 없는 미러).
docker rmi $(docker images | grep "^" | awk "{print $3}")
모든 dangling 데이터 볼륨을 삭제합니다(예: 사용하지 않는 volume).
docker volume rm $(docker volume ls -qf dangling=true)
Fundebug는 실시간, 전문적인 오류 감시 서비스를 제공하여 당신의 온라인 코드를 보호하고 보호합니다. 여러분의 무료 사용을 환영합니다!
3. 컨테이너의 로그 크기 제한
한 번은 내가 1과 2에서 언급한 방법으로 디스크를 청소한 후에 아무런 작용이 없다는 것을 발견하고 일련의 분석을 진행했다.
Ubuntu에서 미러, 컨테이너 등 Docker의 모든 관련 파일은/var/lib/docker/디렉토리에 저장됩니다.
du -hs /var/lib/docker/
97G /var/lib/docker/
Docker가 거의 100GB 디스크를 사용했으니 이 정도면 충분하다.두 명령을 사용하여 계속 보면 이렇게 많은 디스크를 사용하는 디렉터리를 찾을 수 있습니다.
92G /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53
docker ps에서 알 수 있듯이nginx 용기의 ID는 a376aa694b22로 위 디렉터리/var/lib/docker/containers/a376aa694b22의 접두사와 일치합니다:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a376aa694b22 192.168.59.224:5000/nginx:1.12.1 "nginx -g 'daemon off" 9 weeks ago Up 10 minutes nginx
그래서 nginx 용기는 92GB의 디스크를 차지했다.더 나아가 디스크 공간을 진정으로 차지하는 것은nginx의 로그 파일임을 알 수 있다.그럼 이해하기 어렵지 않겠네.우리 Fundebug의 매일 데이터 요청이 백만 단계라면 로그 데이터는 자연히 매우 크다.
truncate 명령을 사용하여 nginx 컨테이너의 로그 파일을 "삭제"할 수 있습니다.
truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log
물론 이 명령은 임시로 작용했을 뿐 로그 파일은 조만간 다시 올라올 것이다.근본적으로 문제를 해결하려면nginx 용기의 로그 파일 크기를 제한해야 합니다.이것은 로그의 max-size를 설정할 수 있습니다. 다음은nginx 용기의 docker-compose 프로필입니다.
nginx:
image: nginx:1.12.1
restart: always
logging:
driver: "json-file"
options:
max-size: "5g"
nginx 용기를 다시 시작하면 로그 파일의 크기가 5GB로 제한되어 더 이상 걱정하지 마세요~
4. Docker 재시작
또 한 번은 거울, 용기, 데이터 볼륨을 정리한 후에 디스크 공간이 줄어들지 않았다는 것을 발견했다.Docker disk usage에서 언급한 건의에 따라 Docker를 다시 시작했는데 디스크 사용률이 83%에서 19%로 낮아진 것을 발견했다.고수의 지적에 따르면 이것은 내부 핵 3.13과 관련된 BUG일 것이다. 그래서 Docker는 일부 쓸모없는 디렉터리를 정리할 수 없다.
it's quite likely that for some reason when those container shutdown, docker couldn't remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS.
The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers.
나는 내부 핵 버전을 살펴보았는데 정말 3.13:인 것을 발견하였다
uname -r
3.13.0-86-generic
만약 당신의 핵 버전도 3.13이고 디스크 청소가 성공하지 못했다면, Docker를 다시 시작하는 것도 괜찮습니다.물론 이 밤의 조작은 비교적 믿을 만하다.
참고 자료
작성자: Fundebug 링크:https://www.jianshu.com/p/0c5d021b6783출처: 저작권은 작가의 소유이며, 그 어떠한 형식의 전재도 작가에게 연락하여 권한을 수여받고 출처를 밝혀 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.