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 练习题(含可执行步骤)#
- 练习:创建 2 个版本镜像并保留最新
docker pull alpine:3.18
docker pull alpine:3.19
# 保留最新,删除旧版本
docker rmi alpine:3.18
# 验证
docker images | grep alpine
- 练习:清理悬空镜像
# 构建一个中断的镜像(制造 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
- 练习:自测磁盘占用与清理效果
docker system df
docker system prune -a -f
docker system df