为什么Docker映像会占用Docker不使用的磁盘空间


80

我已经设置了泊坞窗,并且使用了完全不同的块设备来存储泊坞窗的系统数据:

[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也已用完。

我可以通过删除一些Docker映像来验证此问题。在我删除了一些docker映像之后,/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
2015年

Answers:


63

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

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

这使我重新获得了空间,但是与启动替换实例并没有什么不同。我还没有找到更好的解决方案。


19
我只是经历了同样的事情,而您不必卸载docker。我要做的就是停止docker,删除目录,然后启动docker。
分组密码算法

2
什么目录 / var / lib / docker?如果这样做,我的图像就会松动。如果我尝试先将图像保存到.tar文件,也会失败:安装'/ dev / mapper / docker-202:...输入/输出错误
Toby

5
@Toby yes /var/lib/docker,这将删除您的所有图像和容器。您正在重设Docker,因此不要指望能够保存所有内容。
纳撒尼尔·怀斯布鲁克

57

删除我的整个/ 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以查看已清理的内容

docker info

解决方案2:

与此同时,请确保docker容器内的程序未将太多/庞大的文件写入文件系统。

检查正在运行的docker进程的空间使用大小

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(以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 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我绝对是答案中最安全的选择。我的机器空间不足。修剪了吗,我现在有50 Gb的可用空间...希望我早知道这一点
costrouc

3
对该答案的投票表明人们发现它很有用。不过,为了清楚起见,这是在回答一个稍有不同的问题:“我如何回收Docker使用的空间?” 而问题是关于Docker占用了空间,但后来却说没有(那prune是没用的,因为Docker认为没有什么可修剪的)
Nathaniel 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

这样,您不必重新配置docker。


5

我有一个类似的问题,我认为当您的磁盘上没有足够的空间容纳所有Docker映像时,就会发生这种情况。我为Docker映像保留了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的现有实例

    须藤rm -rf / var / lib / docker

  • 将以下选项传递给docker守护程序:-s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.mountopt = discard

  • 启动docker daemon

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

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

5

有同样的问题。在我的方案中,我的vbox存储空间不足。经过调查发现,我的docker本地卷吞噬了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]

这样可以释放未使用的本地卷的磁盘空间。在我的方案中,释放了20 GB的存储空间。如果要保留它们,请确保要保留的容器正在运行,因为这样做会删除所有已停止的容器。


这不会直接回答原始问题,但在类似情况下很有用。
BearOak​​heart



0

也许您可以尝试docker system prune删除所有不重要的图像


-1

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

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

有关如何完成上述任务的详细说明。

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

您也可以删除中间层。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.