Docker容器批量清理与优化脚本

代码脚本 · 容器

批量清理Docker无用容器、镜像、卷和网络,优化磁盘空间,输出清理报告

详细内容

#!/bin/bash # ========================================== # Docker容器批量清理与优化脚本 # 用途:清理无用容器、镜像、卷,释放磁盘空间 # 使用方法:bash docker_cleanup.sh # ========================================== echo "========== Docker清理优化报告 ==========" echo "执行时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # 检查Docker是否运行 if ! command -v docker &> /dev/null; then echo "❌ 错误: Docker未安装" exit 1 fi if ! docker info &> /dev/null; then echo "❌ 错误: Docker服务未运行" exit 1 fi # 清理前磁盘使用 echo "【清理前状态】" BEFORE_CONTAINERS=$(docker ps -aq | wc -l) BEFORE_IMAGES=$(docker images -q | wc -l) BEFORE_VOLUMES=$(docker volume ls -q | wc -l) echo " 容器总数: $BEFORE_CONTAINERS" echo " 镜像总数: $BEFORE_IMAGES" echo " 卷总数: $BEFORE_VOLUMES" echo "" # 1. 清理已停止的容器 echo "【1. 清理已停止的容器】" STOPPED_CONTAINERS=$(docker ps -aq -f status=exited -f status=created) if [ -n "$STOPPED_CONTAINERS" ]; then COUNT=$(echo "$STOPPED_CONTAINERS" | wc -l) echo " 发现 $COUNT 个已停止容器,正在清理..." echo "$STOPPED_CONTAINERS" | xargs docker rm 2>/dev/null echo " ✅ 已清理 $COUNT 个已停止容器" else echo " ✅ 无已停止容器" fi echo "" # 2. 清理悬空镜像 echo "【2. 清理悬空镜像(dangling)】" DANGLING_IMAGES=$(docker images -f "dangling=true" -q) if [ -n "$DANGLING_IMAGES" ]; then COUNT=$(echo "$DANGLING_IMAGES" | wc -l) echo " 发现 $COUNT 个悬空镜像,正在清理..." echo "$DANGLING_IMAGES" | xargs docker rmi 2>/dev/null echo " ✅ 已清理 $COUNT 个悬空镜像" else echo " ✅ 无悬空镜像" fi echo "" # 3. 清理未使用的镜像 echo "【3. 清理未使用的镜像】" UNUSED_IMAGES=$(docker images -q | while read img; do if ! docker ps -a --format '{{.Image}}' | grep -q "$img"; then echo "$img" fi done | sort -u) if [ -n "$UNUSED_IMAGES" ]; then COUNT=$(echo "$UNUSED_IMAGES" | wc -l) echo " 发现 $COUNT 个未使用镜像" echo " 提示: 未使用镜像可能是近期需要的,默认保留" echo " 如需清理,请执行: docker image prune -a" else echo " ✅ 所有镜像都在使用中" fi echo "" # 4. 清理未使用的卷 echo "【4. 清理未使用的卷】" UNUSED_VOLUMES=$(docker volume ls -qf dangling=true) if [ -n "$UNUSED_VOLUMES" ]; then COUNT=$(echo "$UNUSED_VOLUMES" | wc -l) echo " 发现 $COUNT 个未使用卷,正在清理..." echo "$UNUSED_VOLUMES" | xargs docker volume rm 2>/dev/null echo " ✅ 已清理 $COUNT 个未使用卷" else echo " ✅ 无未使用卷" fi echo "" # 5. 清理未使用的网络 echo "【5. 清理未使用的自定义网络】" UNUSED_NETWORKS=$(docker network ls -qf type=custom | while read net; do if [ -z "$(docker network inspect -f '{{range .Containers}}{{.Name}}{{end}}' "$net" 2>/dev/null)" ]; then echo "$net" fi done) if [ -n "$UNUSED_NETWORKS" ]; then COUNT=$(echo "$UNUSED_NETWORKS" | wc -l) echo " 发现 $COUNT 个未使用网络,正在清理..." echo "$UNUSED_NETWORKS" | xargs docker network rm 2>/dev/null echo " ✅ 已清理 $COUNT 个未使用网络" else echo " ✅ 无未使用网络" fi echo "" # 6. 清理构建缓存 echo "【6. 清理构建缓存】" BUILD_CACHE_SIZE=$(docker system df 2>/dev/null | grep "Build Cache" | awk '{print $3}') if [ -n "$BUILD_CACHE_SIZE" ] && [ "$BUILD_CACHE_SIZE" != "0B" ]; then echo " 构建缓存大小: $BUILD_CACHE_SIZE" echo " 正在清理构建缓存..." docker builder prune -f 2>/dev/null echo " ✅ 已清理构建缓存" else echo " ✅ 无构建缓存" fi echo "" # 清理后状态 echo "【清理后状态】" AFTER_CONTAINERS=$(docker ps -aq | wc -l) AFTER_IMAGES=$(docker images -q | wc -l) AFTER_VOLUMES=$(docker volume ls -q | wc -l) echo " 容器总数: $AFTER_CONTAINERS (减少 $((BEFORE_CONTAINERS-AFTER_CONTAINERS)))" echo " 镜像总数: $AFTER_IMAGES (减少 $((BEFORE_IMAGES-AFTER_IMAGES)))" echo " 卷总数: $AFTER_VOLUMES (减少 $((BEFORE_VOLUMES-AFTER_VOLUMES)))" echo "" # 磁盘使用 echo "【Docker磁盘使用】" docker system df 2>/dev/null echo "" echo "========== 清理完成 ==========" echo "提示: 如需深度清理(删除所有未使用镜像),执行: docker system prune -a"

适配环境

适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+

依赖环境:bash 4.0+

参数说明

[]
Docker容器清理优化磁盘空间

更多容器