15.3.5 镜像删除与清理策略

5. 镜像删除与清理策略#

5.1 原理草图:镜像-容器-层关系#

文章图片

5.2 删除镜像的基本操作(含示例)#

场景:创建测试镜像与容器,演示删除流程

# 1) 拉取镜像
docker pull nginx:1.25

# 2) 启动容器(引用镜像)
docker run -d --name web_1 nginx:1.25

# 3) 尝试删除镜像(会失败)
docker rmi nginx:1.25
# 预期输出:image is being used by running container

# 4) 先停止并删除容器
docker stop web_1
docker rm web_1

# 5) 再删除镜像
docker rmi nginx:1.25

常用命令说明

# 删除指定镜像
docker rmi <image_id|repo:tag>

# 强制删除(不推荐在生产使用)
docker rmi -f <image_id>

# 删除无标签悬空镜像(dangling)
docker image prune -f

# 删除未被使用的所有镜像(dangling + 未引用镜像)
docker image prune -a -f

5.3 清理策略与场景化命令组合#

开发环境频繁构建(定期清理)

# 查看磁盘占用
docker system df

# 清理无用镜像与构建缓存
docker image prune -a -f
docker builder prune -f

CI/CD流水线保留最近 N 个镜像(示例脚本)

#!/usr/bin/env bash
# 文件:/opt/cleanup/keep_last_3.sh
# 作用:保留某仓库最近3个镜像,其余删除

REPO="myapp"
KEEP=3

docker images --format "{{.Repository}}:{{.Tag}} {{.CreatedAt}}" \
  | grep "^${REPO}:" \
  | sort -rk2 \
  | awk "NR>${KEEP}{print \$1}" \
  | xargs -r docker rmi

磁盘空间告警(快速释放)

# 快速清理未使用容器、镜像、网络、构建缓存
docker system prune -a -f

# 如需清理无用卷(谨慎)
docker system prune -a --volumes -f

5.4 镜像与容器引用关系处理#

# 查看哪些容器依赖该镜像
docker ps -a --filter ancestor=nginx:1.25

# 统计某镜像被多少容器引用
docker ps -a --filter ancestor=nginx:1.25 --format "{{.Names}}" | wc -l

示例:批量删除依赖镜像的容器

# 删除所有依赖 nginx:1.25 的容器
docker ps -a --filter ancestor=nginx:1.25 -q | xargs -r docker rm -f
# 再删除镜像
docker rmi nginx:1.25

5.5 排错清单与解决命令#

错误 1:image is being used by running container

# 定位容器
docker ps --filter ancestor=nginx:1.25

# 停止并删除
docker stop <container_id>
docker rm <container_id>

错误 2:大量镜像残留 / 磁盘未释放

# 查看 Docker 实际占用
docker system df -v

# 清理构建缓存
docker builder prune -f

# 清理无用层
docker image prune -a -f

错误 3:清理后空间仍高

# 定位大目录
du -sh /var/lib/docker/* | sort -h

# 检查日志文件(示例:容器日志过大)
ls -lh /var/lib/docker/containers/*/*.log
# 可通过 logrotate 或限制日志大小进行治理

5.6 练习题(含可执行步骤)#

  1. 练习:创建 2 个版本镜像并保留最新
docker pull alpine:3.18
docker pull alpine:3.19

# 保留最新,删除旧版本
docker rmi alpine:3.18

# 验证
docker images | grep alpine
  1. 练习:清理悬空镜像
# 构建一个中断的镜像(制造 dangling)
cat > /tmp/Dockerfile <<'EOF'
FROM alpine:3.19
RUN echo "test" > /data.txt
EOF
docker build -t myapp:test /tmp
docker tag myapp:test myapp:old
docker rmi myapp:test

# 查看悬空镜像
docker images -f "dangling=true"

# 清理
docker image prune -f
  1. 练习:自测磁盘占用与清理效果
docker system df
docker system prune -a -f
docker system df