乐于分享
好东西不私藏

Docker 镜像管理工具|AI+Linux 实战训练营

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. 1. 删除前请确认:删除镜像前请确保没有容器正在使用该镜像,否则删除会失败
  2. 2. 备份重要镜像:执行批量清理前,建议先导出重要镜像备份
  3. 3. 仓库推送需登录:推送镜像到私有仓库前,请先执行 docker login 登录
  4. 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 网络问题不再头疼!

🚀 觉得有用欢迎 点赞、在看、关注,持续更新极简、无坑的运维实战脚本!