Clean up docker on mac
清理 OSX 系统中的 Docker 容器、镜像与数据卷
说实话一直以来都很信任Docker的客户端,毕竟使用这么久只遇到过三次问题:
低版本几年前安装在服务器上出现过碎文件占用完所有的iNodes,
df -i
发现是 100% IUse。早先从
boot2docker
升级到Docker For Mac
出现过程序进程死掉,然后所有储存数据都消失,但是磁盘占用不减少的问题。这次在
v18.0X
发现存在清理各种数据之后,磁盘占用不减少的问题。
解决方法
导出所有需要的自建镜像,并重置 Docker
保存数据,可以适当更新客户端到最新的稳定版本。
解决过程
下面来聊聊解决过程。
由于我已经全部重置,所以只演示示意流程。
望闻问切
在 OSX 系统可以使用 du
和 df
确认磁盘(包含子文件)占用和 iNodes 占用。
如果发现你明明干掉了不必要的数据卷和无用镜像以及废弃容器,磁盘占用空间还是很大(我之前是几十G);或者明明硬盘还没用满,但是由于 iNodes
用尽导致无法写入文件了,那么应该给 Docker
看病的时机就到了。
头疼医头 - 高阶命令
表象是磁盘资源被过度占用,所以治理表象需要把资源释放掉。
下面给出几种不同的方法,具体哪种可用,因版本而异,请自取辨别。
Docker
1.13之后,其实官方支持了更高级的打扫命令:docker system prune
。
默认使用会告知你它的工作模式是删除所有停止运行的容器,所有单容器使用的虚拟网卡,所有无名称的镜像,所有构建过程的缓存内容。
但是如果你想清理数据卷的话,可以这样用:
如果你想清理掉没有使用的镜像,而并非那些讨厌的 <None>
镜像的话,可以这样用:
头疼医头 - 基础命令
如果你担心上面的方法搞不定或者无法使用 system
命令解决问题,那么可以试试直接调用它的实现方法。
清理不用的容器:
使用 volume
、network
、container
、image
对数据卷、虚拟网卡、容器、镜像进行清理,注意这里这些命令都支持 filter
参数,支持使用以下表达式进行高效过滤:
label=, label==, label!=, or label!==
例如这样使用:
'exited=0'
'until=24h'
'statue!=running'
为了表示简洁,下面以 $COMMAND
代替上面的具体命令,实际使用替换回来。
头疼医头 - 低阶命令
如果上面的命令你还是使用起来有问题,没关系,可以使用更低阶的版本,我个人使用的alias中,常年存放了两条命令:
没错,使用 docker rm
和 docker rmi
命令可以直接对容器和镜像进行清理,不过对于虚拟网卡和数据卷就不适用了,不过你可以配合系统的 rm
删除掉其他数据:
头疼医头 - 界面重置
当然,我试验过最近两个版本的 Docker For Mac 使用界面按钮 Reset to factory default 重置数据也是极其有效的。
治标治本
尽己所能的升级你的客户端版本,新版本会包含老版本的 Bugfix,并且关注以下两个问题反馈官方的处理结果,毕竟这个实际是文件储存系统的Bug,暂时真的是彻底解决不能,不然我也不会给出三个指标不治本的方法了,你说是不。
Last updated