我做了一个Docker课程来实现它,我正在尝试迁移我的第一个应用程序。在日常使用中,我发现很难跟踪我的磁盘可用空间。我注意到每次运行图像并删除时,它都不会返回原始可用空间量。
生活周期我给我的容器,从头到尾都是:docker build ...
自定义的容器从节点和标准redis运行。我的操作系统是OSX 10.11.6
在一天结束时,我看到我一直在失去Mbs。我究竟做错了什么? Docker这个缓存可能是我在路上错过的东西?
更新时间为2019-03-26
现在我们可以使用一个命令来做到这一点
docker system prune -a --volumes
警告:
默认情况下,如果当前没有使用该卷的容器,则不会删除卷以防止删除重要数据。运行命令以修剪卷时使用
--volumes
标志:
有关this的更多信息
Docker存储有三个区域可以挂载,因为Docker非常谨慎 - 它不会自动删除任何区域:已退出的容器,未使用的容器卷,未使用的图像层。在具有大量构建和运行的开发环境中,可能会占用大量磁盘空间。
这三个命令清除了未使用的任何内容:
docker rm $(docker ps -f status=exited -aq)
- 删除已停止的容器docker rmi $(docker images -f "dangling=true" -q)
- 删除任何图像中未使用的图像图层docker volume rm $(docker volume ls -qf dangling=true)
- 删除任何容器未使用的卷。它们可以安全运行,它们不会删除图像引用的图像层或容器使用的数据卷。您可以为它们添加别名,和/或将它们放在CRON作业中以定期清理本地磁盘。
Mac上的Docker还有一个额外的问题,它会伤害很多人:docker.qcow2文件可能会超出比例(高达64GB)并且不会自行缩减。
https://github.com/docker/for-mac/issues/371
正如djs55的一个回复中所述,这是在计划中修复,但它不是一个快速修复。引用:
.qcow2作为块设备暴露给VM,最大大小为64GiB。由于容器中的文件系统中创建了新文件,因此将新扇区写入块设备。这些新扇区被附加到.qcow2文件中,导致它的大小增加,直到最终完全分配。它达到这个最大尺寸时会停止增长。
...
我们希望在几个阶段解决这个问题:(注意这仍然处于规划/设计阶段,但我希望它能给你一个想法)
1)我们将切换到支持TRIM的连接协议,并在qcow2旁边的元数据文件中实现自由块跟踪。我们将创建一个压缩工具,可以离线运行以缩小磁盘(有点像qemu-img转换,但没有dd if = / dev / zero,它应该很快,因为它已经知道空白的位置在哪里)
2)我们将在VM重新启动时自动运行压缩工具,假设它足够快
3)我们将切换到在线压缩器(有点像编程语言中的GC)
我们还在考虑使.qcow2的最大大小可配置。也许64GiB对于某些环境而言太大了,而较小的上限会有所帮助吗?
更新2019:已经对Docker for Mac进行了许多更新,因为发布了这个答案以帮助缓解问题(特别是:支持不同的文件系统)。
虽然清理仍然不是完全自动的,您可能需要不时修剪。有关可以帮助清理磁盘空间的单个命令,请参阅zhongjiajie's answer。
docker container prune
docker system prune
docker image prune
docker volume prune
有关如何限制docker磁盘空间的几个选项,我首先限制/旋转日志:Docker container logs taking all my disk space
例如。如果您有最近的docker版本,则可以使用每个容器的--log-opt max-size=50m
选项启动它。此外 - 如果您有旧的未使用的容器,您可以考虑查看位于/var/lib/docker/containers/*/*-json.log
的docker日志
还值得一提的是,使用以下命令时,docker.qcow2(或使用Apple文件系统的High Sierra上的Docker.raw)的文件大小看起来非常大(~64GiB),比实际大。
ls -klsh Docker.raw
这可能会有某种误导,因为它将输出文件的逻辑大小而不是其物理大小。
要查看文件的物理大小,可以使用此命令:
du -h Docker.raw
资料来源:https://docs.docker.com/docker-for-mac/faqs/#disk-usage