#!/bin/bash # =========================================================== # Docker 容器选项式管理脚本 # 作者:anfioo # 功能:交互式查看、管理、操作 Docker 容器 # =========================================================== # 获取所有容器信息 get_containers() { docker ps -a --format "{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}" } # 容器选择菜单 select_container() { echo "请选择一个容器(输入序号):" mapfile -t containers < <(get_containers) for i in "${!containers[@]}"; do echo "$((i+1)). ${containers[$i]}" done echo "0. 退出" read -p "选择容器编号:" choice if [[ $choice -eq 0 ]]; then exit 0 fi container_id=$(echo "${containers[$((choice-1))]}" | awk '{print $1}') container_name=$(echo "${containers[$((choice-1))]}" | awk '{print $5}') echo echo "🎯 你选择了容器:$container_name ($container_id)" echo container_menu "$container_id" "$container_name" } # 容器信息展示菜单 container_menu() { local id="$1" local name="$2" while true; do echo "==============================" echo "容器:$name ($id)" echo "==============================" echo "1. 查看元数据(docker ps 样式)" echo "2. 查看详细信息(Labels、Volumes、Network、Restart)" echo "3. 容器控制操作(进入、停止、启动、重启、日志)" echo "4. 全部详细信息(inspect 解析展示)" echo "0. 返回容器列表" echo "==============================" read -p "选择功能:" action case $action in 1) docker ps -a --filter "id=$id" ;; 2) echo "🔹 Labels:" docker inspect "$id" | jq '.[0].Config.Labels' echo echo "🔹 Volumes:" docker inspect "$id" | jq '.[0].Mounts[] | {Name, Source, Destination}' echo echo "🔹 Network:" docker inspect "$id" | jq -r '.[0].HostConfig.NetworkMode' echo echo "🔹 Restart Policy:" docker inspect "$id" | jq -r '.[0].HostConfig.RestartPolicy.Name' ;; 3) container_control_menu "$id" "$name" ;; 4) container_details "$id" ;; 0) clear select_container ;; *) echo "无效输入,请重新选择。" ;; esac done } # 容器控制操作菜单 container_control_menu() { local id="$1" local name="$2" while true; do echo echo "=== 🛠️ 容器控制菜单:$name ===" echo "1. 进入容器 (bash)" echo "2. 停止容器" echo "3. 启动容器" echo "4. 重启容器" echo "5. 查看日志" echo "0. 返回上级菜单" echo "===========================" read -p "选择功能:" op case $op in 1) echo "进入容器:$name" docker exec -it "$id" bash || docker exec -it "$id" sh ;; 2) docker stop "$id" ;; 3) docker start "$id" ;; 4) docker restart "$id" ;; 5) log_menu "$id" ;; 0) return ;; *) echo "无效输入,请重新选择。" ;; esac done } # 日志查看菜单 log_menu() { local id="$1" while true; do echo echo "=== 📜 日志查看菜单 ===" echo "1. 全部日志(退出)" echo "2. 实时跟踪 (-f)" echo "3. 最近 100 条并跟踪" echo "4. 最近 100 条并退出" echo "0. 返回上级菜单" echo "======================" read -p "选择功能:" log_choice case $log_choice in 1) docker logs "$id" ;; 2) docker logs -f "$id" ;; 3) docker logs -n 100 -f "$id" ;; 4) docker logs -n 100 "$id" ;; 0) return ;; *) echo "无效输入,请重新选择。" ;; esac done } # 功能展示3:完整信息 container_details() { local id="$1" echo echo "=== 🧾 容器详细信息 ===" echo "运行命令:" docker inspect "$id" | jq -r '.[0].Config.Cmd' echo echo "运行环境变量:" docker inspect "$id" | jq -r '.[0].Config.Env[]' echo echo "端口信息:" docker inspect "$id" | jq -r '.[0].NetworkSettings.Ports' echo echo "状态信息:" docker inspect "$id" | jq -r '.[0].State' echo echo "内存/CPU 限制:" docker inspect "$id" | jq '.[0].HostConfig | {Memory, NanoCpus}' echo echo "运行时间:" docker inspect "$id" | jq -r '.[0].State.StartedAt' echo echo "运行路径:" docker inspect "$id" | jq -r '.[0].GraphDriver.Data.MergedDir' echo echo "运行用户:" docker inspect "$id" | jq -r '.[0].Config.User' echo echo "版本信息:" docker inspect "$id" | jq -r '.[0].Config.Image' echo echo "挂载卷:" docker inspect "$id" | jq -r '.[0].Mounts[] | {Name, Source, Destination}' echo echo "网络组:" docker inspect "$id" | jq -r '.[0].HostConfig.NetworkMode' echo echo "重启策略:" docker inspect "$id" | jq -r '.[0].HostConfig.RestartPolicy.Name' echo echo "==============================" } # 主流程 clear select_container