如何清理Docker数据

2,408 阅读4分钟

Docker用久了,会占用大量的磁盘空间。输入以下命令,可能会看到一些可怕的使用状况统计:

docker system df

本文将介绍一些清理docker空间的方法,包括如何清理未使用的镜像(image),容器(container)和卷(volume)。

其实所有"清理"的重点,都在于断舍离的心态,与家庭收纳整理时的两难心态大同小异。如果你是一名docker重度用户,本文可能会有些帮助。

定期清理

最好每隔一段时间运行一下如下命令,它可以安全地删除那些已停止的volume,未使用的network和image:

docker system prune

如果大胆一点,可以加上'-a'选项:

docker system prune -a

这样可以清除任何与正在运行的容器无关的image。一般来说不会有什么损失,必要时docker会重新下载其所需的镜像。唯一的损失是第一次下载时会慢一些。如果磁盘空间告急,这是一个帮你用时间换空间的好办法。

以下介绍一些特定项的具体清理方法。

镜像(Image)清理

Docker镜像是应用程序(如web server,runtime或dbms)的磁盘快照。可以通过输入以下内容来查看所有活动镜像和挂起的镜像(即与容器无关联的镜像):

docker image ls -a

可以通过输入以下内容删除Docker映像:

docker image rm <name_or_id>

  • tip: 可以通过添加多个镜像id(空格分隔)来一次性删除多个镜像

容器(Container)清理

容器是镜像的运行实例,同一镜像可以启动任意数量的容器。容器通常很小,因为它们是无状态的,并引用镜像的文件系统。输入以下命令查看所有正在运行和已停止的容器:

docker container ls -a

想要删除容器,需先停止它:

docker container stop <name_or_id>

然后输入以下内容来删除容器:

docker container rm <name_or_id>

  • tip: 同样可以用一条命令同时删除多个镜像(多镜像id空格分隔)。
  • tip: 如果docker run命令中使用了"--rm"选项,表示一旦容器停止,将自动删除的容器。

网络(Network)清理

容器间的通信依赖于Docker所管理的Network。Network是不占用太多磁盘空间的配置文件。输入以下命令可以查看所有network信息:

docker network ls

输入以下命令可以删除未使用的network:

docker network rm <name_or_id>

  • tip: 同样可以同时删除多个network(多network id空格分隔)。

卷(Volume)清理

Volume是虚拟磁盘映像。它被附加到正在运行的容器上,以便在容器重启后能保存状态信息(如文件)。Volume的大小取决于它的用途。通常它是占用磁盘空间的大户,比如典型的数据库,即使还没什么数据的时候,也要占用数百兆的空间。

输入以下命令查看所有Volume信息:

docker volume ls

注意,Volume里保存的是持久化的状态(文件、数据等),清理需要慎重。

比如,对数据库类应用,通常需要专门的数据导出备份操作。数据库系统大多都提供备份工具,比如MySQL中的mysqldump。可以使用docker exec在容器内执行备份操作。

例如,以下命令可以用来备份一个运行在名为'mysql'的容器里名为'mydb'的数据库,数据备份至宿主机器的当前目录中名为'backup.sql'的文件,mysql的用户名'root',密码'mysecret':

docker exec mysql /usr/bin/mysqldump -u root -pmysecret mydb > backup.sql

在Windows PowerShell中的等效命令为:

docker exec mysql /usr/bin/mysqldump -u root -pmysecret -r mydb | Set-Content backup.sql

当然也可以使用docker cp命令将数据文件从正在运行的容器中拷进拷出,如下命令:

docker cp mycontainer:/some/file ./host/directory

在确保重要数据有了可靠的备份以后,就可以通过以下命令来删除特定的volume:

docker volume rm <name>

或者可以使用以下方法来删除所有未使用的volume:

docker volume prune

或者,docker volume prune -a将其全部删除。都已经备份过了,是吧?:D

全面清理

最后的大招!可以用来删除所有未使用的image, container, volume和network:

docker system prune -a --volumes

  • "-f"选项表示强制清除。

执行完成后,Docker将恢复到没有任何数据的原始状态