도커 이미지가 도커에서 사용하지 않는 디스크 공간을 차지하는 이유


82

나는 도커를 설정했고 완전히 다른 블록 장치를 사용하여 도커의 시스템 데이터를 저장했습니다.

[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"

참고 /disk/1완전히 다른 하드 드라이브를 사용하고 있습니다/dev/xvdi

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.6G  67% /
devtmpfs        1.9G  108K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdi        20G  5.3G   15G  27% /disk1
/dev/dm-1       9.8G  1.7G  7.6G  18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2       9.8G  1.7G  7.7G  18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac

문제는 계속해서 도커 이미지를 다운로드하고 도커 컨테이너를 실행하면 다른 하드 드라이브 /dev/xvda1도 다 사용 된 것 같습니다 .

일부 도커 이미지를 제거하여이 문제를 확인할 수 있습니다. 일부 도커 이미지를 제거한 후 /dev/xvda1이제 추가 공간이 있습니다.

내가 뭔가를 놓치고 있습니까?

내 도커 버전 :

[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
 Pool Name: docker-202:1-275421-pool
 Pool Blocksize: 64 Kb
 Data file: /disk1/docker/devicemapper/devicemapper/data
 Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
 Data Space Used: 3054.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 4.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09

당신은 게시 할 수 있습니다fdisk -l
user2915097

답변:


64

이는 RedHat OS 제품군 (RedHat, Fedora, CentOS 및 Amazon Linux)에 영향을 미치는 devicemapper의 커널 문제입니다. 삭제 된 컨테이너는 매핑 된 디스크 공간을 확보하지 않습니다. 즉, 영향을받는 OS에서 컨테이너를 시작하고 다시 시작할 때 공간이 서서히 부족해집니다.

Docker 프로젝트는 이것을 알고 있으며 커널은 아마도 업스트림 ( https://github.com/docker/docker/issues/3182 ) .

일종의 해결 방법은 Docker에 쓸 자체 볼륨을 제공하는 것입니다 ( "Docker가 디스크 공간을 차지할 때" ). 이것은 실제로 공간을 먹는 것을 막지는 않습니다. 단지 시스템의 다른 부분을 파괴하는 것입니다.

내 해결책은 docker를 제거한 다음 모든 파일을 삭제 한 다음 다시 설치하는 것입니다.

sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker

이것은 내 공간을 되찾았지만 대체 인스턴스를 시작하는 것과 크게 다르지 않습니다. 더 좋은 해결책을 찾지 못했습니다.


20
나는 똑같은 일을 겪었고 당신은 도커를 제거 할 필요가 없습니다. 내가해야 할 일은 도커를 중지하고 디렉토리를 삭제 한 다음 도커를 시작하는 것뿐이었습니다.
blockcipher

2
어떤 디렉토리? / var / lib / docker? 그렇게하면 이미지가 느슨해집니다. 이미지를 먼저 .tar 파일에 저장하려고하면 실패합니다. '/ dev / mapper / docker-202 : ... 입력 / 출력 오류 마운트 오류
Toby

5
@Toby yes /var/lib/docker, 모든 이미지와 컨테이너를 삭제합니다. Docker를 하드 리셋하고 있으므로 모든 것을 저장할 수 있다고 기대하지 마십시오.
Nathaniel Waisbrot

61

내 전체 / var / lib / docker를 삭제하는 것은 나에게 좋지 않습니다. 다음은 더 안전한 방법입니다.

해결책 1 :

문제의 다음 명령은 나를 위해 공간을 정리하고 / var / lib / docker를 삭제하거나 Windows의 경우 여기에서 디스크 이미지 위치를 확인하는 것보다 훨씬 안전 합니다 .

전에:

docker info

출력 예 :

Metadata file: 
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB

최신 버전의 Docker (예 : 17.x +)의 명령

docker system prune -a

중지 된 모든 컨테이너, 네트워크, 이미지 및 빌드 캐시를 제거한다는 경고가 표시됩니다. 일반적으로 이것을 제거하는 것이 안전합니다. (다음에 컨테이너를 실행하면 Docker 레지스트리에서 가져올 수 있습니다.)

출력 예 :

Total reclaimed space: 1.243GB

그런 다음 도커 정보를 다시 실행하여 정리 된 항목을 볼 수 있습니다.

docker info

해결 방법 2 :

이와 함께 도커 컨테이너 내부의 프로그램이 파일 시스템에 많은 / 거대한 파일을 쓰지 않는지 확인하십시오.

실행중인 도커 프로세스의 공간 사용 크기 확인

docker ps -s #may take minutes to return

또는 모든 컨테이너, 심지어 종료

docker ps -as #may take minutes to return

그런 다음 문제가되는 컨테이너를 삭제할 수 있습니다.

docker rm <CONTAINER ID>

긱 공간을 사용할 수있는 가능한 원인 찾기

docker exec -it <CONTAINER ID> "/bin/sh"
du -h

제 경우에는 프로그램이 임시 파일을 작성하고있었습니다.

( Nathaniel Waisbrot 가이 문제에 대한 답변에서 언급했으며 문제 에서 몇 가지 정보를 얻었습니다)


또는

이전 버전의 Docker (예 : 1.13.x)의 명령 (sudo가 아닌 루트로 실행) :

# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)

# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)

# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)

이후 :

> docker info
Metadata file: 
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB

2
docker system prune --force내가 본 답변 중 가장 안전한 옵션입니다. 내 컴퓨터의 공간이 부족했습니다. 가지 치기를했고 이제
50Gb를 사용하지 않았습니다

4
이 답변에 대한 찬성표는 사람들이 유용하다고 생각한다는 것을 나타냅니다. 그러나 이것은 "Docker가 사용하는 공간을 어떻게 회수 할 수 있습니까?"라는 약간 다른 질문에 대한 대답입니다. 문제는 부두 노동자가 공간을 사용하지만이 사실을 부정하지에 대한였다 반면 (그래서 prune도커 자두에 아무 것도 볼 수 없기 때문에 쓸모가)
나다니엘 Waisbrot

6

이동 /var/lib/docker디렉토리를 .

/data디렉토리에 충분한 공간이 있다고 가정하면 공간이 충분하지 않은 경우 대체합니다.

sudo systemctl stop docker

sudo mv /var/lib/docker /data


sudo ln -s /data/docker /var/lib/docker

sudo systemctl start docker

이렇게하면 도커를 재구성 할 필요가 없습니다.


6

같은 문제가있었습니다. 내 시나리오에서는 vbox에 저장 공간이 부족했습니다. 조사 결과 내 도커 로컬 볼륨이 30GB를 차지한다는 사실이 밝혀졌습니다. Ubuntu 16.04 호스트.

당신의 것을 찾으려면.

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   0                   1.361GB             1.361GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       7                   0                   9.413GB             9.413GB (100%)
Build Cache                                                 0B                  0B



docker system prune --volumes


  WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

이렇게하면 사용되지 않는 로컬 볼륨의 디스크 공간이 확보됩니다. 내 시나리오에서는 20GB의 저장 공간을 확보했습니다. 중지 된 모든 컨테이너를 제거하므로 유지하려는 경우 유지하려는 컨테이너가 실행 중인지 확인하십시오 .


이것은 원래 질문에 직접 응답하지 않지만 유사한 시나리오에서 유용합니다.
BearOakheart

5

비슷한 문제가 있었고 디스크에 모든 도커 이미지를 저장할 공간이 충분하지 않을 때 이런 일이 발생한다고 생각합니다. 나는 도커 이미지를 위해 6GB를 예약했는데 내 경우에는 충분하지 않은 것으로 판명되었습니다. 어쨌든 모든 이미지와 컨테이너를 제거했지만 여전히 디스크가 가득 찬 것처럼 보였습니다. 대부분의 공간은 / var / lib / docker / devicemapper 및 / var / lib / docker / tmp에서 사용되었습니다.

이 명령은 나를 위해 작동하지 않았습니다.

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

먼저 Docker 서비스를 중지했습니다.

sudo service docker stop

그런 다음 / var / lib / docker를 삭제했습니다.

그런 다음 누군가가 https://github.com/docker/docker/issues/18867#issuecomment-232301073 에서 제안한 것을 수행했습니다.

  • docker 메타 데이터 rm -rf / var / lib / docker의 기존 인스턴스 제거

    sudo rm -rf / var / lib / docker

  • 다음 옵션을 docker 데몬에 전달합니다. -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.mountopt = discard

  • 도커 데몬을 시작합니다.

마지막 두 단계에서 다음을 실행합니다.

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

4

기본적으로 Docker 정리는 볼륨을 제거하지 않습니다.

당신은 같은 것을 시도 할 수 있습니다

docker volume prune -f

docker system prune --volumes는 완벽하게 작동합니다. 이전에는 --volume 이었지만 지금은 --volumes입니다.
Zeb Davis

6
docker system prune --all --volumes
David Portabella

3

이슈 # 18867 에서 언급했듯이 -컨테이너 devicemapper에서 데이터 삭제 는 Github.com에서 사용 된 공간확보 할 수 없습니다.

아래 명령을 실행 해보십시오.

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

fstrim도구를 사용하여 devicemapper 씬 프로비저닝 된 디스크를 트리밍합니다.


이것은 나를 위해 일했습니다. 루프 모드에서 devicemapper를 사용하기 때문일 수 있습니다.
zeroimpl

0

docker system prune중요하지 않은 모든 이미지를 제거 할 수 있습니다.


0

MacOS에서이 문제가 발생한 사람들의 경우 저에게 도움이 된 솔루션은 Docker가 호스트의 논리적 공간을 예약하는 데 사용하는 Docker.raw 파일을 찾은 다음 삭제하는 것입니다. Docker Desktop이있는 경우 다음으로 이동할 수 있습니다.

Preferences -> Resources -> AdvancedDisk image location탭 아래를 살펴보세요 .

터미널에서 해당 폴더로 이동하여 Docker.raw파일 ( $ rm -rf Docker.raw)을 삭제하십시오.

중요 참고 사항 : 기존 이미지 나 볼륨이 필요하지 않을 때만 수행하십시오.


-1

예, Docker는 / var / lib / docker 폴더를 사용하여 레이어를 저장합니다. 공간을 재 확보하고 스토리지를 다른 디렉토리로 이동하는 방법이 있습니다.

더 큰 디스크 공간을 마운트하고 / var / lib / docker의 내용을 새 마운트 위치로 이동하고 sym 링크를 만들 수 있습니다.

위의 작업을 수행하는 방법에 대한 자세한 설명이 있습니다.

http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html

중간 레이어도 제거 할 수 있습니다.

https://github.com/vishalvsh1/docker-image-cleanup

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.