developer tip

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

optionbox 2020. 12. 8. 07:58
반응형

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


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

[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

이는 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

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


내 전체 / 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

I had a similar problem and I think this happens when you don't have enough space in the disk for all your docker images. I had 6GB reserved for docker images which it turned out not to be enough in my case. Anyway, I had removed every image and container and still disk looked full. Most of the space was being used by /var/lib/docker/devicemapper and /var/lib/docker/tmp.

This command didn't work for me:

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

First, I stopped docker service:

sudo service docker stop

Then I deleted /var/lib/docker:

Then I did what somebody suggested here in https://github.com/docker/docker/issues/18867#issuecomment-232301073

  • Remove existing instance of docker metadata rm -rf /var/lib/docker

    sudo rm -rf /var/lib/docker

  • Pass following options to docker daemon: -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

  • Start docker daemon.

For last two steps, I run:

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

Move the /var/lib/docker directory.

Assuming the /data directory has enough room, if not, substitute for one that does,

sudo systemctl stop docker

sudo mv /var/lib/docker /data


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

sudo systemctl start docker

This way, you don't have to reconfigure docker.


As mentioned in issue #18867 - Delete data in a container devicemapper can not free used space from Github.com

Try running the below command:

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

It uses the fstrim tool to trim the devicemapper thinly-provisioned disk.


Docker prune by default does not remove volumes,

you can try something like

docker system prune --volume

maybe you can try docker system prune to remove all the images that are not important


I had this problem occurring once in a while in my MacOS with Engine: 19.03.2. In my case, rebuilding the image takes a long time and wasn't a feasible option. So deleting the images / pruning wasn't an option.

The solution was to save the image in a tar, delete the image, quit docker, reload the image from the tar file. Commands for each step as below.

  1. docker save -o <name>.tar <image-name>
  2. docker rmi <image-name>
  3. Quit docker (Observe the Docker.qcow2 file shrinking after this)
  4. Restart docker
  5. docker load -q -i <name>.tar

Try these steps for all the images if the size does not reduce for a single image. My suggestion is to start from older images rather than new ones. (You can save and delete them at once).

Reference: https://dbaontap.com/2017/07/18/clean-qcow2-docker-macbook/


Yes, Docker use /var/lib/docker folder to store the layers. There are ways to reclaim the space and move the storage to some other directory.

You can mount a bigger disk space and move the content of /var/lib/docker to the new mount location and make sym link.

There is detail explanation on how to do above task.

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

You can remove the intermediate layers too.

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

참고URL : https://stackoverflow.com/questions/27853571/why-is-docker-image-eating-up-my-disk-space-that-is-not-used-by-docker

반응형