Docker가 차지하는 디스크 공간 정리

5566 단어
요약: Docker를 사용하면 좋은 점이 많지만 크지도 작지도 않은 문제가 하나 있다. 자칫 디스크를 너무 많이 차지하게 된다. 이것은 우리가 제때에 정리해야 한다는 것을 의미한다.
이점:
  • 모든 서버의 설정은 매우 간단하고 Docker만 설치되어 있어 서버를 추가할 때 매우 간단하다.
  • 서버 간에 다양한 서비스를 쉽게 이동할 수 있고 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를 다시 시작하는 것도 괜찮습니다.물론 이 밤의 조작은 비교적 믿을 만하다.
    참고 자료
  • 누가 디스크를 다 썼습니까?Docker System 명령 상세 정보
  • INTRODUCING DOCKER 1.13
  • Docker 문서:docker system
  • Docker 문서: json-file
  • Docker disk usage

  • 작성자: Fundebug 링크:https://www.jianshu.com/p/0c5d021b6783출처: 저작권은 작가의 소유이며, 그 어떠한 형식의 전재도 작가에게 연락하여 권한을 수여받고 출처를 밝혀 주십시오.

    좋은 웹페이지 즐겨찾기