文章506
标签266
分类65

为你的Docker瘦身

使用Docker时间长之后, 由于docker在删除容器时不会删除容器的volume(在本地的目录映射), 所以可能会出现闲置的volume; 本文教你如何删除那些无用的volume;


为你的Docker瘦身

当使用了一段时间的Docker后, 容器建建删删, 导致本地出现了很多的volume映射, 如:

zk@zk:~/workspace/blog$ docker volume ls
DRIVER              VOLUME NAME
local               5f721f54218c36b265cdad4248ee0183aac04e350ae7c1f77a6778e716ac926d
local               7c4929d538fb7d362c92609b6374fda9990fa460b28af239104661f212080bcd
local               b720909c2cffe69274f19216d64f46305cb16f1d85ecb145898f2ae0f7088462
local               bb07e6af8e09d2be46657e509cb60b51395c19b8391a150edf5d677708c337c0
local               bc0d8821b5fa0f18f54aa4b1e13998e141082c5d052cd5beecd77304594efc24
......

查看 docker 占用的资源

在进行资源清理之前有必要搞清楚 docker 都占用了哪些系统的资源。这需要综合使用不同的命令来完成。

  • docker container ls:默认只列出正在运行的容器,-a 选项会列出包括停止的所有容器;
  • docker image ls:列出镜像信息,-a 选项会列出 intermediate 镜像(就是其它镜像依赖的层);
  • docker volume ls:列出数据卷;
  • docker network ls:列出 network;
  • docker info:显示系统级别的信息,比如容器和镜像的数量等;

通过这些命令查看 docker 使用的资源情况后,相信你已经决定要清理 docker 占用的一些资源了!

让我们先从那些未被使用的资源开始。


只删除那些未被使用的资源

Docker 提供了方便的 docker system prune 命令来删除:

  • 已停止的容器
  • dangling 镜像
  • 未被容器引用的 network
  • 构建过程中的 cache
zk@zk:~/workspace/blog$ docker system prune 
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] n

dangling images:

dangling images可以简单的理解为未被任何镜像引用的镜像。

比如在你重新构建了镜像后,那些之前构建的且不再被引用的镜像层就变成了 dangling images;

安全起见,这个命令默认不会删除那些未被任何容器引用的数据卷

如果需要同时删除未被任何容器引用的数据卷,你需要显式的指定 –volumns 参数

使用 –all 参数后会删除所有未被引用的镜像而不仅仅是 dangling 镜像


删除具体某类资源

在不同在子命令下执行 prune,这样删除的就是某类资源:

  • docker container prune: 删除所有退出状态的容器
  • docker volume prune: 删除未被使用的数据卷
  • docker image prune: 删除 dangling 或所有未被使用的镜像

同时我们也可以通过bash的变量替换来实现相同的效果:

如:

列出dangling volumes:

docker volume ls -qf dangling=true

删除:

docker volume rm $(docker volume ls -qf dangling=true)

让 docker 回到安装时的状态

这里的 “安装时的状态” 指资源占用情况而不是 docker 的相关配置。这也是一种比较常见的用例,比如笔者就需要在一个干净的 docker 环境中自动化的还原出某天的一个生产环境(使用生产环境的备份数据)用于 bug 调查。让我们一起来看看都需要做些什么?

回想我们前面介绍的 docker system prune –all –force –volumns 命令,如果在执行这个命令前系统中所有的容器都已停止,那么这个命令就会移除所有的资源!

好,现在让我们想办法停掉系统中的所有容器。

docker container stop 命令可以停止一个或多个容器,我们只需要把系统中所有在运行的容器罗列出来就可以了。由于 docker 并不介意我们再次停止一个已经停止了的容器,干脆简单粗暴点,直接列出所有的容器(包括已经停止的)!

# -a 显示所有的容器,-q 只显示数字形式的容器 ID
docker container ls -a -q
668dc3e2f7e0
5d3ca8086b36
19849683b494

同样的, 在这里把命令执行的结果作为 docker container stop 命令的参数:

docker container stop $(docker container ls -a -q)

完整的恢复 docker 环境的命令如下:

docker container stop $(docker container ls -a -q) && docker system prune --all --force --volumns

和前面的 prune 命令类似,也可以完全删除某一类资源:

  • 删除所有容器:docker container rm $(docker container ls -a -q)
  • 删除所有镜像:docker image rm $(docker image ls -a -q)
  • 删除所有数据卷:docker volume rm $(docker volume ls -q)
  • 删除所有network:docker network rm $(docker network ls -q)

附录

文章参考:

如果觉得文章写的不错, 可以关注微信公众号: Coder张小凯

内容和博客同步更新~



本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/2020/04/26/为你的Docker瘦身/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可