도커 이미지가 도커에서 사용하지 않는 디스크 공간을 차지하는 이유
나는 도커를 설정했고 완전히 다른 블록 장치를 사용하여 도커의 시스템 데이터를 저장했습니다.
[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.
docker save -o <name>.tar <image-name>
docker rmi <image-name>
- Quit docker (Observe the Docker.qcow2 file shrinking after this)
- Restart docker
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.
'developer tip' 카테고리의 다른 글
StackOverflowException이 throw 될 때 .NET이 그렇게 제대로 작동하지 않는 이유는 무엇입니까? (0) | 2020.12.08 |
---|---|
Jasmine 2.0 비동기 done () 및 angular-mocks inject () 동일한 테스트 it () (0) | 2020.12.08 |
HEAD 기록에서 업스트림 SVN 정보를 확인할 수 없습니다. (0) | 2020.12.08 |
std :: function의 성능 오버 헤드는 무엇입니까? (0) | 2020.12.08 |
en_UK가 잘못된 로케일입니까? (0) | 2020.12.08 |