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+
参数说明
[]