如果你大量使用 Docker,它会占用很多硬盘空间。本文教你如何彻底清理 Docker,包括清理容器文件、镜像文件、networks数据、虚拟磁盘等等。
Docker不对您的系统进行配置更改。但是它可以使用大量的磁盘空间。。使用它一段时间,您可能会震惊地看到一些可怕的使用统计数据返回时,输入:
docker system df
-
可以看到
镜像
有13个镜像,10 个容器 ,10个活跃。占991.5MB内存,可回收( reclaimable)302.9MB(30%)内存 -
幸运的是,Docker允许您通过命令回收不使用的镜像、容器和volumes的磁盘空间。
手动清理
- 要安全地移除停止的容器、未使用的networks和dangling images ,最好经常手动的运行以下命令:
docker system prune
- 一个稍微有点风险的选择是:
docker system prune -a
这也会删除与正在运行的容器没有关联的任何镜像。这可能有点极端,但Docker会重新下载它需要的任何镜像。第一次尝试会稍微慢一点,但是镜像会被缓存以供以后使用。
删除特定项的其他方法。
image收回
Docker镜像是应用程序(如web服务器、语言运行库或数据库管理系统)的磁盘快照。你可以通过输入:
docker image ls -a
- 删除Docker镜像可以输入:
docker image rm <name_or_id>
docker images -a
docker rmi <name_or_id>
任意数量的镜像都可以添加到这个命令中-用一个空格字符分隔它们。
容器清理
Docker容器是镜像的一个正在运行的实例,并且可以从同一个实例启动任意数量的容器。容器通常很小,因为它们是无状态的,并且引用镜像的文件系统。查看所有容器,包括运行和停止,输入:
docker container ls -a
#或者
docker ps -a
只有在容器停止后才能删除它。通过输入:
docker container stop <name_or_id>
然后可以通过输入以下命令删除容器:
docker container rm <name_or_id>
同样,可以向该命令添加任意数量的以空格分隔的容器名、id。
很少有必要保留已停止的容器。——rm选项可以添加到任何docker run命令中,以便在容器终止时自动删除容器。
Network 整理
容器可以附加到docker管理的networks上,这样它们就可以彼此通信。这些配置文件不会占用太多的磁盘空间。查看所有Docker网络,输入:
docker network ls
一个或多个未使用的networks可以通过以下命令删除:
docker network rm <name_or_id>
同样,可以向该命令添加任意数量的以空格分隔的networks名/ id。
Volume 清理
Docker卷是一个虚拟磁盘镜像。它必须附加到一个正在运行的容器上,这样它就可以在重启之间保存文件或其他状态信息。volumes的大小取决于使用它的应用程序,但是一个典型的数据库将需要几百兆的空间,即使它大部分是空的。
查看所有docker管理的磁盘volumes,输入:
docker volume ls
删除一个Docker卷将永远擦除它的数据!没有回头路了。
如果您正在开发一个数据库驱动的应用程序,通常可以保留一个或多个数据转储,这些数据转储可用于重新创建一组特定的记录。大多数数据库客户端工具都提供转储或导出功能,比如管理员中的export功能。
大多数数据库系统都会提供备份工具,比如MySQL中的mysqldump实用程序。这些可以使用docker exec命令在一个正在运行的容器上执行。
下面的Linux/macOS命令将MySQL数据库mydb备份到一个名为backup.sql的文件中。使用MySQL root用户,密码为mysecret:
docker exec mysql /usr/bin/mysqldump -u root -pmysecret mydb \
> backup.sql
你也可以用docker cp命令将数据文件复制到或从一个正在运行的容器中。这是传递的源和目标路径,其中容器引用的名称/ID后跟冒号及其路径,例如:
docker cp mycontainer:/some/file ./host/directory
假设你的数据是安全的,你可以删除任何未使用的volumes输入:
docker volume rm <name>
所有未使用的Docker卷,那些当前未被附加到运行容器上的volumes,可以通过以下方式删除:
docker volume prune
或者,docker volume prune -a
将全部删除。但是你先需要做了重要数据备份?
- 删除未使用的volume
#列出未使用的volume
$ docker volume ls -qf dangling=true
#删除未使用的volume
$ docker volume rm $(docker volume ls -qf dangling=true)
开始大扫除
每个未使用的容器、镜像、volumes和networks都可以用一个命令清除:
docker system prune -a --volumes
添加-f如果你想强制擦除而不提示确认。您的系统将回到一个原始状态,没有任何Docker数据。