Docker 镜像管理工具|AI+Linux 实战训练营
Docker 镜像管理工具
🔥CentOS 7 运维神器!纯Shell实现Docker镜像一键管理,批量清理/智能筛选/仓库同步全搞定!
大家好,这里是「运维 AI 实战营」!
在前几篇文章中,我们已经完成了 Docker 集群监控大屏、容器一键管理、自动化部署、日志收集、健康巡检、备份恢复等实战脚本。✅
今天是给大家带来一款 纯 Shell 编写、零第三方依赖 的 Docker 镜像管理工具,支持 批量清理无用镜像、智能筛选查询、镜像仓库同步,解决镜像越积越多、磁盘空间爆满的运维痛点!
一键查看所有镜像、批量删除、标签管理、仓库同步,本地实测零报错,运维日常必备!
✅ 功能清单
-
• ✅ 查看所有镜像:清晰展示镜像名称、标签、大小、创建时间 -
• ✅ 查看占用空间:统计镜像总大小,快速定位大体积镜像 -
• ✅ 批量清理无用镜像:一键删除 dangling 镜像(无标签、无容器使用) -
• ✅ 按名称筛选镜像:支持模糊搜索,快速定位目标镜像 -
• ✅ 删除指定镜像:输入镜像名/ID,一键删除,带二次确认防误删 -
• ✅ 镜像标签管理:给镜像打标签、删除标签,方便版本管理 -
• ✅ 镜像导出/导入:支持将镜像导出为 tar 文件,或从 tar 导入 -
• ✅ 镜像仓库同步:一键推送镜像到远程仓库,或从仓库拉取 -
• ✅ 循环菜单:操作完成后自动返回菜单,无需重新启动工具
📌 必看说明
-
• ✅ 零依赖:仅用 CentOS 7 原生 bash + docker 命令,无需安装任何第三方工具 -
• ✅ 防误删设计:删除操作需二次确认,避免手滑误删重要镜像 -
• ✅ 已真机验证:CentOS 7 最小化系统实测通过,复制命令直接运行 -
• ✅ 普通用户可执行:脚本自动检测权限,非 root 用户会提示使用 sudo
一键安装脚本(100% 可运行)
⚠️ 全程 root 用户操作,无需修改任何命令,直接复制粘贴即可!
1. 清理旧环境(必执行,避免冲突)
# 杀死旧管理工具进程pkill -f docker_image_manager.sh# 删除旧脚本文件rm -f /usr/local/bin/docker_image_manager.sh
2. 部署管理工具
cat > /usr/local/bin/docker_image_manager.sh <<'EOF'#!/bin/bash# 颜色定义RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'BLUE='\033[0;34m'NC='\033[0m' # No Color# 检查是否为 root 用户check_root() { if [ "$EUID" -ne 0 ]; then echo -e "${RED}[!] 警告:当前非 root 用户,部分操作可能需要 sudo${NC}" fi}# 显示菜单show_menu() { clear echo -e "${BLUE}=================================================${NC}" echo -e "${GREEN} Docker 镜像管理工具(CentOS 7)${NC}" echo -e "${BLUE}=================================================${NC}" echo "" echo -e "${YELLOW} 1${NC} 查看所有镜像(名称/标签/大小/时间)" echo -e "${YELLOW} 2${NC} 查看镜像占用空间统计" echo -e "${YELLOW} 3${NC} 批量清理无用镜像(dangling)" echo -e "${YELLOW} 4${NC} 按名称筛选镜像" echo -e "${YELLOW} 5${NC} 删除指定镜像" echo -e "${YELLOW} 6${NC} 镜像标签管理(添加/删除标签)" echo -e "${YELLOW} 7${NC} 导出镜像为 tar 文件" echo -e "${YELLOW} 8${NC} 从 tar 文件导入镜像" echo -e "${YELLOW} 9${NC} 推送镜像到远程仓库" echo -e "${YELLOW} 10${NC} 从远程仓库拉取镜像" echo -e "${YELLOW} 0${NC} 退出工具" echo "" echo -e "${BLUE}=================================================${NC}"}# 1. 查看所有镜像list_images() { echo -e "\n${GREEN}[+] 所有镜像列表:${NC}\n" printf "%-25s %-15s %-10s %-20s\n" "镜像名称" "标签" "大小" "创建时间" printf "%-25s %-15s %-10s %-20s\n" "-------------------------" "---------------" "----------" "--------------------" docker images --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" | \ while IFS=$'\t' read -r repo tag size created; do printf "%-25s %-15s %-10s %-20s\n" "$repo" "$tag" "$size" "$created" done echo ""}# 2. 查看镜像占用空间image_disk_usage() { echo -e "\n${GREEN}[+] Docker 镜像空间占用统计:${NC}\n" docker system df -v | grep -A 1000 "Images" echo "" total_size=$(docker images --format "{{.Size}}" | wc -l) echo -e "${YELLOW}镜像总数:${total_size} 个${NC}" echo ""}# 3. 批量清理无用镜像clean_dangling() { echo -e "\n${YELLOW}[!] 即将清理 dangling 镜像(无标签、无容器使用)${NC}" read -p "确定继续?(y/n): " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then echo -e "\n${GREEN}[+] 正在清理...${NC}" docker image prune -f echo -e "${GREEN}[✓] 清理完成!${NC}" else echo -e "${RED}[-] 已取消${NC}" fi}# 4. 按名称筛选镜像filter_images() { read -p "输入要筛选的镜像名称(支持模糊匹配):" keyword echo -e "\n${GREEN}[+] 筛选结果:${NC}\n" docker images --format "{{.Repository}}:{{.Tag}} | 大小: {{.Size}} | ID: {{.ID}}" | grep "$keyword" if [ $? -ne 0 ]; then echo -e "${RED}[-] 未找到匹配的镜像${NC}" fi echo ""}# 5. 删除指定镜像delete_image() { read -p "输入要删除的镜像名或ID(如 nginx:latest 或 abc123):" image echo -e "\n${YELLOW}[!] 警告:此操作不可恢复!${NC}" read -p "确定删除镜像 $image ?(y/n): " confirm if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then echo -e "\n${GREEN}[+] 正在删除...${NC}" docker rmi "$image" 2>/dev/null if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 镜像已删除${NC}" else echo -e "${RED}[!] 删除失败,镜像可能正在被使用${NC}" echo -e "${YELLOW}提示:如需强制删除,请使用 docker rmi -f $image${NC}" fi else echo -e "${RED}[-] 已取消${NC}" fi}# 6. 镜像标签管理tag_management() { echo -e "\n${GREEN}标签管理选项:${NC}" echo " 1. 给镜像添加新标签" echo " 2. 删除镜像标签" echo " 0. 返回" read -p "请选择:" tag_choice case $tag_choice in 1) read -p "源镜像(如 nginx:latest):" source_img read -p "新标签(如 myregistry/nginx:v1.0):" new_tag docker tag "$source_img" "$new_tag" if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 标签添加成功${NC}" else echo -e "${RED}[!] 标签添加失败${NC}" fi ;; 2) read -p "要删除的标签(如 nginx:latest):" del_tag docker rmi "$del_tag" 2>/dev/null if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 标签已删除${NC}" else echo -e "${RED}[!] 删除失败${NC}" fi ;; 0) return ;; esac}# 7. 导出镜像export_image() { read -p "要导出的镜像名(如 nginx:latest):" img_name read -p "导出文件名(如 nginx-backup.tar):" file_name echo -e "\n${GREEN}[+] 正在导出镜像...${NC}" docker save -o "$file_name" "$img_name" if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 导出成功:$file_name${NC}" ls -lh "$file_name" else echo -e "${RED}[!] 导出失败${NC}" fi}# 8. 导入镜像import_image() { read -p "tar 文件路径(如 ./nginx-backup.tar):" tar_file if [ ! -f "$tar_file" ]; then echo -e "${RED}[!] 文件不存在:$tar_file${NC}" return fi echo -e "\n${GREEN}[+] 正在导入镜像...${NC}" docker load -i "$tar_file" if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 导入成功!${NC}" echo -e "\n${GREEN}[+] 导入的镜像:${NC}" docker images --format "{{.Repository}}:{{.Tag}}" | head -5 else echo -e "${RED}[!] 导入失败${NC}" fi}# 9. 推送镜像到仓库push_image() { read -p "要推送的镜像名(如 myimage:v1.0):" img_name read -p "仓库地址(如 registry.example.com,直接回车使用 Docker Hub):" registry if [ -n "$registry" ]; then full_name="$registry/$img_name" docker tag "$img_name" "$full_name" else full_name="$img_name" fi echo -e "\n${GREEN}[+] 正在推送 $full_name ...${NC}" docker push "$full_name" if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 推送成功!${NC}" else echo -e "${RED}[!] 推送失败,请检查仓库配置和登录状态${NC}" fi}# 10. 从仓库拉取镜像pull_image() { read -p "要拉取的镜像名(如 nginx:latest 或 registry.example.com/myimage:v1.0):" img_name echo -e "\n${GREEN}[+] 正在拉取 $img_name ...${NC}" docker pull "$img_name" if [ $? -eq 0 ]; then echo -e "${GREEN}[✓] 拉取成功!${NC}" else echo -e "${RED}[!] 拉取失败${NC}" fi}# 主程序main() { check_root while true; do show_menu read -p "请输入操作编号:" choice case $choice in 1) list_images ;; 2) image_disk_usage ;; 3) clean_dangling ;; 4) filter_images ;; 5) delete_image ;; 6) tag_management ;; 7) export_image ;; 8) import_image ;; 9) push_image ;; 10) pull_image ;; 0) echo -e "\n${GREEN}[+] 感谢使用,再见!${NC}\n" exit 0 ;; *) echo -e "\n${RED}[-] 输入错误,请重新选择${NC}\n" ;; esac echo -e "\n按回车键返回菜单..." read done}mainEOF
3. 添加执行权限
chmod +x /usr/local/bin/docker_image_manager.sh
📌 重要提示:终极避坑提醒
-
1. 删除前请确认:删除镜像前请确保没有容器正在使用该镜像,否则删除会失败 -
2. 备份重要镜像:执行批量清理前,建议先导出重要镜像备份 -
3. 仓库推送需登录:推送镜像到私有仓库前,请先执行 docker login登录 -
4. 空间清理谨慎: docker image prune会删除所有 dangling 镜像,请确认无重要数据
使用方法
启动工具
docker_image_manager.sh
工具界面效果
================================================= Docker 镜像管理工具(CentOS 7)================================================= 1 查看所有镜像(名称/标签/大小/时间) 2 查看镜像占用空间统计 3 批量清理无用镜像(dangling) 4 按名称筛选镜像 5 删除指定镜像 6 镜像标签管理(添加/删除标签) 7 导出镜像为 tar 文件 8 从 tar 文件导入镜像 9 推送镜像到远程仓库 10 从远程仓库拉取镜像 0 退出工具=================================================请输入操作编号:
运行效果
查看所有镜像
[+] 所有镜像列表:镜像名称 标签 大小 创建时间 ------------------------- --------------- ---------- --------------------nginx latest 187MB 2024-03-15 10:23:45 redis alpine 52MB 2024-03-14 08:15:22 mysql 5.7 546MB 2024-03-10 14:30:18 <none> <none> 123MB 2024-03-01 09:12:33
批量清理无用镜像
[!] 即将清理 dangling 镜像(无标签、无容器使用)确定继续?(y/n): y[+] 正在清理...Deleted: sha256:abc123...Deleted: sha256:def456...[✓] 清理完成!按回车键返回菜单...
适合人群
• 运维新手:不熟悉 docker images 命令,想要可视化菜单管理镜像• 服务器管理员:需要定期清理服务器磁盘空间,批量删除无用镜像• DevOps 工程师:需要在多台服务器间同步镜像,导入导出镜像文件• Docker 初学者:想要学习镜像标签管理、仓库推送等进阶操作• CI/CD 维护者:需要在自动化流程中集成镜像管理操作
下期预告
下一期我们将带来 Docker 网络管理工具,支持网络诊断、容器互通检测、端口冲突排查,让 Docker 网络问题不再头疼!
🚀 觉得有用欢迎 点赞、在看、关注,持续更新极简、无坑的运维实战脚本!
夜雨聆风