Docker 磁盘占用清理
日常随着 Docker
的使用,Docker
会逐渐占用磁盘空间,通过 docker system df
可查看 Docker
所占用的空间:
1 | TYPE TOTAL ACTIVE SIZE RECLAIMABLE |
其中 Images
表示镜像,Containers
表示容器,Local Volumes
表示本地卷,Build Cache
表示构建缓存。
整体清理
可以通过 docker system prune
进行一次空间清理:
1 | WARNING! This will remove: |
该操作会删除所有停止的容器,所有未被至少一个容器使用的网络,所有的 dangling
镜像(在构建镜像时产生的 tag
为 none
的镜像,没有和任何其他有 tag
的镜像有关联),所有的 dangling
构建缓存(和 dangling
镜像同理)。
更激进一点,还可以执行 docker system prune -a
,该操作还会删除没有和运行中的容器有关联的镜像。
镜像清理
Docker
镜像是某个应用(如数据库、某个程序语言的运行时)的磁盘快照,可以通过 docker image ls -a
查看所有的镜像(活跃的以及 dangling
的镜像):
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
可以通过 docker image rm <name_or_id>
来删除某个镜像,支持批量删除多个镜像,多个镜像 id
之间使用空格分隔即可。不过,删除镜像要求该镜像没有被某个容器所使用,否则会提示下述类似错误:
1 | Error response from daemon: conflict: unable to delete 4cdc5dd7eaad (must be forced) - image is being used by stopped container 3d9f62acc483 |
可以通过在执行时增加 -f
来强制删除镜像。
容器清理
容器是某个镜像的一个运行实例,可以通过 docker container ls -a
查看所有的容器:
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
要删除一个容器必须要先停止该容器(docker container stop <name_or_id>
),然后通过 docker container rm <name_or_id>
删除,同样的,和删除镜像类似,该命令支持批量删除多个容器,多个容器 id
之间使用空格分隔。
网络清理
Docker
网络用于容器间的通信,它们都是一些配置文件,并不会占用多大空间,可以通过 docker network ls
查看所有的网络:
1 | NETWORK ID NAME DRIVER SCOPE |
可以通过 docker network rm <name_or_id>
来删除一个网络。
数据卷清理
Docker
数据卷用于持久化容器运行时保存的数据,例如通过 Docker
运行 MySQL
时指定数据卷,从而对 MySQL
的数据进行备份,可以通过 docker volume ls
查看所有的数据卷:
1 | DRIVER VOLUME NAME |
同样的,可以通过 docker volume rm <name>
来删除指定的数据卷,或者使用 docker volume prune
来删除所有未和运行中的容器关联的数据卷,以及通过 docker volume prune -a
删除所有的数据卷。
最后,docker system prune -a --volumes
是在 docker system prune -a
的基础上删除所有未使用的卷。