清理 OSX 系统中的 Docker 容器、镜像与数据卷

本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2018年07月19日 统计字数: 2581字 阅读时间: 6分钟阅读 本文链接: https://soulteary.com/2018/07/19/cleanup-your-docker-for-mac.html


清理 OSX 系统中的 Docker 容器、镜像与数据卷

说实话一直以来都很信任Docker的客户端,毕竟使用这么久只遇到过三次问题:

  1. 低版本几年前安装在服务器上出现过碎文件占用完所有的iNodes, df-i 发现是 100% IUse。
  2. 早先从 boot2docker 升级到 DockerForMac 出现过程序进程死掉,然后所有储存数据都消失,但是磁盘占用不减少的问题。
  3. 这次在 v18.0X 发现存在清理各种数据之后,磁盘占用不减少的问题。

解决方法

导出所有需要的自建镜像,并重置 Docker 保存数据,可以适当更新客户端到最新的稳定版本。

解决过程

下面来聊聊解决过程。

由于我已经全部重置,所以只演示示意流程。

望闻问切

在 OSX 系统可以使用 du 和 df 确认磁盘(包含子文件)占用和 iNodes 占用。

 
  1. df -ih ~/Library/Containers/com.docker.docker/
  2.  
  3. Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
  4. /dev/disk1s1 466Gi 426Gi 36Gi 93% 3286807 9223372036851489000 0% /
  5.  
  6. du -d 1 -h ~/Library/Containers/com.docker.docker/
  7. 4.4G /Users/soulteary/Library/Containers/com.docker.docker//Data
  8. 4.4G /Users/soulteary/Library/Containers/com.docker.docker/

如果发现你明明干掉了不必要的数据卷和无用镜像以及废弃容器,磁盘占用空间还是很大(我之前是几十G);或者明明硬盘还没用满,但是由于 iNodes 用尽导致无法写入文件了,那么应该给 Docker 看病的时机就到了。

头疼医头 - 高阶命令

表象是磁盘资源被过度占用,所以治理表象需要把资源释放掉。

下面给出几种不同的方法,具体哪种可用,因版本而异,请自取辨别。

Docker 1.13之后,其实官方支持了更高级的打扫命令: docker system prune

默认使用会告知你它的工作模式是删除所有停止运行的容器,所有单容器使用的虚拟网卡,所有无名称的镜像,所有构建过程的缓存内容。

 
  1. docker system prune
  2. WARNING! This will remove:
  3. - all stopped containers
  4. - all networks not used by at least one container
  5. - all dangling images
  6. - all build cache
  7. Are you sure you want to continue? [y/N]

但是如果你想清理数据卷的话,可以这样用:

 
  1. docker system prune --volume

如果你想清理掉没有使用的镜像,而并非那些讨厌的 <None> 镜像的话,可以这样用:

 
  1. docker system prune --all

头疼医头 - 基础命令

如果你担心上面的方法搞不定或者无法使用 system 命令解决问题,那么可以试试直接调用它的实现方法。

清理不用的容器:

 
  1. docker container prune
  2. # 或者可以带参数清理停止运行一天以上
  3. docker container prune until=24h

使用 volume、 network、 container、 image 对数据卷、虚拟网卡、容器、镜像进行清理,注意这里这些命令都支持 filter 参数,支持使用以下表达式进行高效过滤:

label=, label==, label!=, or label!==

例如这样使用:

  • 'exited=0'
  • 'until=24h'
  • 'statue!=running'

为了表示简洁,下面以 $COMMAND 代替上面的具体命令,实际使用替换回来。

 
  1. docker $COMMAND prune
  2. # 清理所有内容
  3. docker $COMMAND prune --all
  4. # 或者给定条件进行清除
  5. docker $COMMAND prune --filter <exp>

头疼医头 - 低阶命令

如果上面的命令你还是使用起来有问题,没关系,可以使用更低阶的版本,我个人使用的alias中,常年存放了两条命令:

 
  1. cat ~/.alias/docker.sh
  2. #!/usr/bin/env bash
  3.  
  4. # 清除无用的镜像
  5. alias give-me-remove-docker-unused-images='docker rmi $(docker images -f "dangling=true" -q)'
  6. # 清理无用容器
  7. alias give-me-remove-docker-unused-container='docker rm $(docker ps --filter status=exited -q)'

没错,使用 docker rm 和 docker rmi 命令可以直接对容器和镜像进行清理,不过对于虚拟网卡和数据卷就不适用了,不过你可以配合系统的 rm 删除掉其他数据:

 
  1. rm -rf ~/Library/Containers/com.docker.docker/Data

头疼医头 - 界面重置

![界面大法]( https://attachment.soulteary.com/2018/07/19/reset-docker-for-mac.png)

当然,我试验过最近两个版本的 DockerForMac 使用界面按钮 Resetto factorydefault 重置数据也是极其有效的。

治标治本

尽己所能的升级你的客户端版本,新版本会包含老版本的 Bugfix,并且关注以下两个问题反馈官方的处理结果,毕竟这个实际是文件储存系统的Bug,暂时真的是彻底解决不能,不然我也不会给出三个指标不治本的方法了,你说是不。

 
  1. https://github.com/docker/for-mac/issues/371
  2. https://github.com/moby/moby/issues/21925

最后

欢迎讨论斧正本文内容,当然,如果官方解决了这个问题,我也会同时更新文章修正内容。

--EOF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值