为什么docker镜像会占用Docker未使用的磁盘空间

min*_*nel 63 diskspace device-mapper 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"
Run Code Online (Sandbox Code Playgroud)

请注意,/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
Run Code Online (Sandbox Code Playgroud)

问题是当我继续下载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
Run Code Online (Sandbox Code Playgroud)

Nat*_*rot 53

这是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
Run Code Online (Sandbox Code Playgroud)

这让我的空间恢复了,但与启动替换实例没什么不同.我还没有找到更好的解决方案.

  • 我只是经历了同样的事情,你不必卸载docker.我需要做的就是停止docker,删除目录,然后启动docker. (16认同)
  • 什么目录 / var / lib / docker?如果这样做,我的图像就会松动。如果我尝试先将图像保存到.tar文件,也会失败:挂载'/ dev / mapper / docker-202:...输入/输出错误 (2认同)
  • @Toby yes`/ var / lib / docker`,它将删除所有图像和容器。您正在重设Docker,因此不要指望能够保存所有内容。 (2认同)

rjd*_*olb 44

删除我的整个/ var/lib/docker对我来说不合适.这些是更安全的方式:

解决方案1:

从发出以下命令清理空间,对我来说,它是不是删除在/ var/lib中/搬运工或为Windows更安全了很多检查您的磁盘映像的位置在这里.

之前:

docker info
Run Code Online (Sandbox Code Playgroud)

在较新版本的Docker中命令,例如17.x +

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
Run Code Online (Sandbox Code Playgroud)

(它将显示'Total reclaimed space')

例如,总回收空间:1.243GB

解决方案2:

除此之外,请确保docker容器中的程序不会将许多/大文件写入文件系统.

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

docker system prune -a
Run Code Online (Sandbox Code Playgroud)

或所有容器,甚至退出

Total reclaimed space: 1.243GB
Run Code Online (Sandbox Code Playgroud)

然后,您可以删除有问题的容器

docker info
Run Code Online (Sandbox Code Playgroud)

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

docker ps -s #may take minutes to return
Run Code Online (Sandbox Code Playgroud)

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

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


要么

旧版Docker中的命令,例如1.13.x(以root身份运行而不是sudo):

docker ps -as #may take minutes to return
Run Code Online (Sandbox Code Playgroud)

之后:

docker rm <CONTAINER ID>
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的赞成票表明人们发现它很有用。不过,要清楚的是,这是在回答一个略有不同的问题“我如何回收 Docker 正在使用的空间?” 而问题是关于 Docker 使用空间,然后说它没有(所以 `prune` 没用,因为 Docker 看不到任何东西可以修剪) (4认同)
  • `docker system prune --force` 绝对是我见过的答案中最安全的选项。我的机器空间不足。修剪了,我现在有 50 Gb 免费...希望我早点知道 (2认同)
  • `docker system prune -a` 对我有用,它为我回收了 32G 空间。 (2认同)

Bea*_*art 7

有同样的问题。在我的场景中,我的 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]
Run Code Online (Sandbox Code Playgroud)

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


小智 5

移动/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
Run Code Online (Sandbox Code Playgroud)

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


rod*_*olk 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/
Run Code Online (Sandbox Code Playgroud)

首先,我停止了docker服务:

sudo service docker stop
Run Code Online (Sandbox Code Playgroud)

然后我删除了/ var/lib/docker:

然后我在https://github.com/docker/docker/issues/18867#issuecomment-232301073做了有人建议的

  • 删除docker metadata 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
Run Code Online (Sandbox Code Playgroud)


Nir*_*hah 5

默认情况下,Docker prune 不会删除卷,

你可以尝试类似的东西

docker volume prune -f
Run Code Online (Sandbox Code Playgroud)

  • `docker system prune --all --volumes` (9认同)