清理docker资源
引言:这几天,开发测试用服务器又磁盘满了,因为开发过程中经常有临时的build部署,服务器上的废弃images等资源累积很快,又得清理docker的资源了,整理下脚本,添加个定时任务去清理吧。
由此,整理下清理docker资源的命令,以方便备查。清理 Docker 是一个常见需求,因为 Docker 的镜像、容器、网络和卷可能会占用大量磁盘空间。如果你发现 Docker 的磁盘空间不足,可以按照以下步骤来清理不必要的资源。
1. 清理未使用的镜像
当你拉取镜像或构建镜像时,Docker 会保留它们,哪怕它们已经不再被使用。
清理未使用的镜像
sudo docker image prune
- 只会删除 未被任何容器使用的悬空镜像(dangling images)。
- 悬空镜像是指没有标签(
<none>
)的镜像。
清理所有未使用的镜像
sudo docker image prune -a
- 删除所有没有被任何容器使用的镜像(包括带标签的镜像)。
- 如果某些镜像可能会在未来再次使用,建议不要使用
-a
参数。
2. 清理未使用的容器
当你停止一个容器后,容器的存储空间仍然会占用磁盘,直到你手动删除它。
列出所有停止的容器
sudo docker ps -a -f status=exited
删除所有停止的容器
sudo docker container prune
- 会删除所有停止的容器。
- 如果你只想删除特定的容器,可以先使用
docker ps -a
查看容器 ID,然后手动删除:sudo docker rm <container_id>
3. 清理未使用的卷
Docker 卷用于持久化容器数据,即使容器被删除,卷仍会保留。因此,未使用的卷可能会占用大量空间。
列出所有未使用的卷
sudo docker volume ls -f dangling=true
删除所有未使用的卷
sudo docker volume prune
- 注意:未使用的卷是指没有被任何容器挂载的卷。
4. 清理未使用的网络
Docker 网络也会随着时间的推移累积,尤其是一些用户自定义网络或孤立网络。
列出所有未使用的网络
sudo docker network ls
删除未使用的网络
sudo docker network prune
- 只会删除未被任何容器使用的网络。
- 注意:默认的网络(如
bridge
、host
和none
)不会被清理。
5. 一键清理所有未使用的资源
如果你想一次性清理所有未使用的 Docker 资源(镜像、容器、卷、网络),可以使用以下命令:
sudo docker system prune
清理所有未使用的资源(包括未使用的镜像)
sudo docker system prune -a
-a
参数会删除所有未被使用的镜像,而不仅仅是悬空镜像。- 注意:这可能会删除你以后可能需要的镜像,请谨慎使用。
6. 查看磁盘占用情况
在清理之前或之后,你可以查看 Docker 的磁盘空间使用情况。
查看 Docker 资源的磁盘占用
sudo docker system df
示例输出
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 2 1.2GB 800MB (66%) Containers 3 1 500MB 400MB (80%) Local Volumes 4 2 2GB 1.5GB (75%) Build Cache 0 0 0B 0B
7. 手动删除特定资源
删除特定的容器
sudo docker rm <container_id>
删除特定的镜像
sudo docker rmi <image_id>
删除特定的卷
sudo docker volume rm <volume_name>
删除特定的网络
sudo docker network rm <network_name>
8. 清理 Docker 的构建缓存
Docker 在构建镜像时会产生缓存,随着时间的推移可能占用大量磁盘空间。
清理构建缓存
sudo docker builder prune
清理所有的构建缓存(包括运行中的)
sudo docker builder prune --all
9. 定期清理的建议
为了避免 Docker 资源堆积,可以设置定期清理的计划任务。例如,使用 cron
定期运行以下命令:
设置定期清理未使用的资源
编辑 cron
任务:
sudo crontab -e
添加以下内容(每周清理一次未使用的资源):
0 2 * * 0 docker system prune -f
总结
清理 Docker 的资源需要根据实际需求选择合适的命令:
- 清理未使用的镜像:
docker image prune -a
- 清理停止的容器:
docker container prune
- 清理未使用的卷:
docker volume prune
- 清理未使用的网络:
docker network prune
- 一键清理所有未使用资源:
docker system prune -a
在清理之前,建议使用 docker system df
查看资源占用情况。