为什么docker镜像吃掉了docker没有使用的磁盘空间

我有安装docker,我已经使用完全不同的块设备来存储docker的系统数据:

[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 

问题是,当我继续下载Docker镜像并运行Docker容器时,似乎其他硬盘驱动器/dev/xvda1也用完了。

我可以通过删除一些泊坞窗图像来validation这个问题。 在删除了一些docker映像之后, /dev/xvda1现在有了一些额外的空间。

我错过了什么吗?

我的docker版本:

 [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 

这是devicemapper的内核问题,它影响到RedHat系列操作系统(RedHat,Fedora,CentOS和Amazon Linux)。 已删除的容器不会释放映射的磁盘空间。 这意味着,在受影响的操作系统上,当您启动并重新启动容器时,您将慢慢地耗尽空间。

Docker项目意识到了这一点,而且内核应该是固定在上游的( https://github.com/docker/docker/issues/3182 )。

解决方法是给Docker自己的卷写入( “当Docker吃掉磁盘空间时” )。 这实际上并没有阻止它进入空间,只是从系统的其他部分取下之后。

我的解决scheme是卸载docker,然后删除所有的文件,然后重新安装:

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

这让我的空间回来了,但是与启动替代实例并没有多大区别。 我还没有find更好的解决scheme。

删除我的整个/ var / lib / docker对我来说并不好。 这是一个更安全的方法:

解决scheme1:

以下命令从这个问题中清除了我的空间,比删除/ var / lib / docker更安全

之前:

 > 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 

命令(以root身份运行而不是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版本中

 > docker system prune --force 

之后:

 > 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 

解决scheme2:

除此之外,请确保Docker容器内的程序不将许多/大文件写入文件系统。

检查你正在运行的进程的空间

 docker ps -s #may take minutes to return 

find可能使用演出空间的罪魁祸首

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

在我的情况下,该程序正在写临时文件的演出。

( Nathaniel Waisbrot在接受的答案中提到这个问题 ,我从这个问题得到了一些信息)

我有一个类似的问题,我认为这发生在你没有足够的空间在磁盘上的所有泊坞窗图像。 我有6GB的预留docker图像,结果certificate我的情况不够。 无论如何,我已经删除了每个图像和容器,仍然看起来盘满了。 大部分空间被/ 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:

然后我做了什么有人build议在这里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

  • 启动docker守护进程。

对于最后两个步骤,我运行:

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

移动/ var / llib / docker目录。

假设/根目录有足够的空间,如果没有,replace一个,

 sudo systemctl stop docker mv /usr/lib/docker /root ln -s /root/docker /var/lib/docker systemctl start docker 

这样,您不必重新configuration泊坞窗。

如问题#18867所述 – 删除容器devicemapper中的数据不能从Github.com中释放已用空间

尝试运行以下命令:

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

它使用fstrim工具来修剪devicemapper fstrimconfiguration的磁盘。

是的,Docker使用/ var / lib / docker文件夹来存储图层。 有办法回收空间,并将存储移动到其他目录。

您可以挂载更大的磁盘空间,并将/ var / lib / docker的内容移动到新的挂载位置并build立sym链接。

有关如何做以上任务的详细说明。

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

您也可以删除中间层。

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