前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于Docker服务磁盘空间清理的总结

关于Docker服务磁盘空间清理的总结

作者头像
用户8851537
修改2021-07-27 18:03:34
修改2021-07-27 18:03:34
3K00
代码可运行
举报
运行总次数:0
代码可运行

Docker的镜像(image)、容器(container)、数据卷(volume), 都是由daemon托管的。 因此,在需要清理时,也需要使用其自带的手段。

本文介绍一些Docker的清理技巧,以及它们的来源。

要知道的

  1. 一般 docker rm container 不能清除这个容器的残余数据
  2. 本文所指的悬挂指的是带有<none>字样

清理技巧小结

清理所有停止运行的容器:

代码语言:javascript
代码运行次数:0
运行
复制
docker container prune

清理所有正在运行及其停止的容器

代码语言:javascript
代码运行次数:0
运行
复制
docker rm $(docker ps -aq)

清理所有悬挂(dangling)(<none>)镜像:

代码语言:javascript
代码运行次数:0
运行
复制
docker image prune
# or
docker rmi $(docker images -qf "dangling=true")

清理所有无用数据卷:

代码语言:javascript
代码运行次数:0
运行
复制
docker volume prune   #清除当前没有正在使用的数据卷

由于prune操作是批量删除类的危险操作,所以会有一次确认。 如果不想输入y<CR>来确认,可以添加-f操作。慎用!

清理停止的容器

代码语言:javascript
代码运行次数:0
运行
复制
docker rm -lv CONTAINER

-l是清理link,v是清理volume。 这里的CONTAINER是容器的name或ID,可以是一个或多个。

参数列表:

Name, shorthand

Default

Description

--force, -f

false

Force the removal of a running container (uses SIGKILL)

--link, -l

false

Remove the specified link

--volumes, -v

false

Remove the volumes associated with the container

清理所有停止的容器

通过docker ps可以查询当前运行的容器信息。 而通过docker ps -a,可以查询所有的容器信息,包括已停止的。

在需要清理所有已停止的容器时,通常利用shell的特性,组合一下就好。

代码语言:javascript
代码运行次数:0
运行
复制
docker rm $(docker ps -aq)

其中,ps-q,是只输出容器ID,方便作为参数让rm使用。 假如给rm指定-f,则可以清理所有容器,包括正在运行的。

这条组合命令,等价于另一条命令:

代码语言:javascript
代码运行次数:0
运行
复制
docker container prune

container子命令,下面包含了所有和容器相关的子命令。 包括docker ps,等价于docker container psdocker container ls。 其余还有startstopkillcp等,一级子命令相当于二级子命令在外面的alias。 而prune则是特别提供的清理命令,这在其它的管理命令里还可以看到,比如imagevolume

按需批量清理容器

清除所有已停止的容器,是比较常用的清理。 但有时会需要做一些特殊过滤。

这时就需要使用docker ps --filter

比如,显示所有返回值为0,即正常退出的容器:

代码语言:javascript
代码运行次数:0
运行
复制
docker ps -a --filter 'exited=0'

同理,可以得到其它非正常退出的容器。

目前支持的过滤器有:

  • id (container's id)
  • label (label=<key> or label=<key>=<value>)
  • name (container's name)
  • exited (int - the code of exited containers. Only useful with --all)
  • status (created|restarting|running|removing|paused|exited|dead)
  • ancestor (<image-name>[:<tag>], <image id> or <image@digest>) - filters containers that were created from the given image or a descendant.
  • before (container's id or name) - filters containers created before given id or name
  • since (container's id or name) - filters containers created since given id or name
  • isolation (default|process|hyperv) (Windows daemon only)
  • volume (volume name or mount point) - filters containers that mount volumes.
  • network (network id or name) - filters containers connected to the provided network
  • health (starting|healthy|unhealthy|none) - filters containers based on healthcheck status

status相关的一些人肉分析

exited 代表 docker stop 停止的容器状态

清理失败

如果在清理容器时发生失败,通过重启Docker的Daemon,应该都能解决问题。

代码语言:javascript
代码运行次数:0
运行
复制
# systemd
sudo systemctl restart docker.service

# initd
sudo service docker restart

清理镜像

与清理容器的psrm类似,清理镜像也有imagesrmi两个子命令。images用来查看,rmi用来删除。

清理镜像前,应该确保该镜像的容器,已经被清除。

代码语言:javascript
代码运行次数:0
运行
复制
docker rmi IMAGE

其中,IMAGE可以是name或ID。 如果是name,不加TAG可以删除所有TAG。

另外,这两个命令也都属于alias。 docker images等价于docker image ls,而docker rmi等价于docker image rm

按需批量清理镜像

代码语言:javascript
代码运行次数:0
运行
复制
docker image prune   # 删除所有悬挂的镜像

ps类似,images也支持--filter参数。

最常清理的应该是<none>了。

代码语言:javascript
代码运行次数:0
运行
复制
docker images --filter "dangling=true"

这条命令,可以删除所有悬挂(dangling)的镜像,也就是显示为<none>的那些。

代码语言:javascript
代码运行次数:0
运行
复制
docker rmi $(docker images -qf "dangling=true")

这条组合命令,如果不写入Bash的alias,几乎无法使用。 不过还有一条等价命令,非常容易使用。

代码语言:javascript
代码运行次数:0
运行
复制
docker image prune

pruneimages类似,也同样支持--filter参数。 其它的filter有:

  • dangling (boolean - true or false)
  • label (label=<key> or label=<key>=<value>)
  • before (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created before given id or references
  • since (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created since given id or references
  • reference (pattern of an image reference) - filter images whose reference matches the specified pattern

清理所有没有正在使用的镜像

这招要慎用,否则需要重新下载。

代码语言:javascript
代码运行次数:0
运行
复制
docker image prune -a

清理数据卷

代码语言:javascript
代码运行次数:0
运行
复制
docker volume rm VOLUME  #来删除一个或多个卷
docker volume prune      #删除所有无用卷    极度危险的命令

数据卷不如容器或镜像那样显眼,但占的硬盘却可大可小。

数据卷的相关命令,都在docker volume中了。

一般用docker volume ls来查看,用docker volume rm VOLUME来删除一个或多个卷。

不过,绝大多数情况下,不需要执行这两个命令的组合。 直接执行docker volume prune就好,即可删除所有无用卷。

注意:这是一个危险操作!甚至可以说,这是本文中最危险的操作! 一般真正有价值的运行数据,都在数据卷中。 (当然也可能挂载到了容器外的文件系统里,那就没关系。) 如果在关键服务停止期间,执行这个操作,很可能会丢失所有数据

从文件系统删除

除配置文件以为,Docker的内容相关文件,基本都放在/var/lib/docker/目录下。

该目录下有下列子目录,基本可以猜测出用途:

  • aufs
  • containers
  • image
  • network
  • plugins
  • swarm
  • tmp
  • trust
  • volumes

一般不推荐直接操作这些目录,除非一些极特殊情况。 操作不当,后果难料,需要慎重。

后果难料针对的是一些不熟悉底层docker的人,比如me。

补充

代码语言:javascript
代码运行次数:0
运行
复制
docker system df 查看docker空间占用情况
ç 查看空间占用细节
docker rm container_id 删除不需要的container
docker rmi image_id 删除不需要的image
docker system prune 自动空间清理
但是,经测试,docker system prune 只清理掉很少的空间
docker system prune --volume 这个清理了很多空间

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 要知道的
  • 清理技巧小结
  • 清理停止的容器
    • 清理所有停止的容器
    • 按需批量清理容器
    • 清理失败
  • 清理镜像
    • 按需批量清理镜像
    • 清理所有没有正在使用的镜像
  • 清理数据卷
  • 从文件系统删除
  • 补充
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档