Update Docker容器管理面板
This commit is contained in:
281
Docker容器管理面板
281
Docker容器管理面板
@@ -1,222 +1,63 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# 实用型 Docker 容器管理脚本
|
# 简单实用的 Docker 容器管理脚本
|
||||||
# 主要功能:容器检测、通过序列号管理容器
|
|
||||||
|
|
||||||
# 颜色定义
|
# 颜色定义
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
BLUE='\033[0;34m'
|
BLUE='\033[0;34m'
|
||||||
CYAN='\033[0;36m'
|
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
# 日志函数
|
|
||||||
log() {
|
|
||||||
echo -e "${GREEN}[✓]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
error() {
|
|
||||||
echo -e "${RED}[✗]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
warning() {
|
|
||||||
echo -e "${YELLOW}[!]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查 Docker
|
# 检查 Docker
|
||||||
check_docker() {
|
check_docker() {
|
||||||
if ! command -v docker &> /dev/null; then
|
if ! command -v docker &> /dev/null; then
|
||||||
error "Docker 未安装"
|
echo -e "${RED}Docker 未安装${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 获取容器状态中文显示
|
# 显示容器列表
|
||||||
get_chinese_status() {
|
|
||||||
local status="$1"
|
|
||||||
case "$status" in
|
|
||||||
"Up"*)
|
|
||||||
echo "运行中"
|
|
||||||
;;
|
|
||||||
"Exited"*)
|
|
||||||
echo "已停止"
|
|
||||||
;;
|
|
||||||
"Created")
|
|
||||||
echo "已创建"
|
|
||||||
;;
|
|
||||||
"Restarting")
|
|
||||||
echo "重启中"
|
|
||||||
;;
|
|
||||||
"Paused")
|
|
||||||
echo "已暂停"
|
|
||||||
;;
|
|
||||||
"Dead")
|
|
||||||
echo "已死亡"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "$status"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# 显示容器列表和编号
|
|
||||||
show_containers() {
|
show_containers() {
|
||||||
echo -e "\n${CYAN}=== 容器列表 ===${NC}"
|
echo -e "\n${BLUE}=== 容器列表 ===${NC}"
|
||||||
printf "%-4s | %-20s | %-10s | %s\n" "编号" "容器名称" "状态" "镜像"
|
echo "编号 | 容器名称 | 状态 | 镜像"
|
||||||
echo "----|----------------------|----------|-------------------"
|
echo "----|----------|------|------"
|
||||||
|
|
||||||
local count=0
|
local count=0
|
||||||
while IFS= read -r line; do
|
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" | tail -n +2 | while read line; do
|
||||||
if [ -n "$line" ]; then
|
if [ -n "$line" ]; then
|
||||||
count=$((count + 1))
|
count=$((count + 1))
|
||||||
name=$(echo "$line" | awk '{print $1}')
|
name=$(echo "$line" | awk '{print $1}')
|
||||||
status=$(echo "$line" | awk '{print $2}')
|
status=$(echo "$line" | awk '{print $2}')
|
||||||
image=$(echo "$line" | awk '{for(i=3;i<=NF;i++) printf $i" "; print ""}' | sed 's/ $//')
|
image=$(echo "$line" | awk '{for(i=3;i<=NF;i++) printf $i" "; print ""}' | sed 's/ $//')
|
||||||
|
|
||||||
# 获取中文状态
|
# 状态显示
|
||||||
chinese_status=$(get_chinese_status "$status")
|
|
||||||
|
|
||||||
# 状态颜色
|
|
||||||
if [[ "$status" == "Up"* ]]; then
|
if [[ "$status" == "Up"* ]]; then
|
||||||
status_display="${GREEN}$chinese_status${NC}"
|
status_display="${GREEN}运行中${NC}"
|
||||||
elif [[ "$status" == "Exited"* ]]; then
|
elif [[ "$status" == "Exited"* ]]; then
|
||||||
status_display="${RED}$chinese_status${NC}"
|
status_display="${RED}已停止${NC}"
|
||||||
else
|
else
|
||||||
status_display="${YELLOW}$chinese_status${NC}"
|
status_display="${YELLOW}$status${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 截断镜像名称
|
echo -e "$count | $name | $status_display | $image"
|
||||||
if [ ${#image} -gt 25 ]; then
|
|
||||||
image="${image:0:22}..."
|
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
printf "%-4s | %-20s | %-10s | %s\n" "$count" "$name" "$status_display" "$image"
|
|
||||||
fi
|
|
||||||
done < <(docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" | tail -n +2)
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
return $count
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 通过编号获取容器名称
|
# 通过编号获取容器名称
|
||||||
get_container_name() {
|
get_container_name() {
|
||||||
local number=$1
|
local number=$1
|
||||||
local count=0
|
local count=0
|
||||||
|
docker ps -a --format "table {{.Names}}" | tail -n +2 | while read name; do
|
||||||
while IFS= read -r line; do
|
if [ -n "$name" ]; then
|
||||||
if [ -n "$line" ]; then
|
|
||||||
count=$((count + 1))
|
count=$((count + 1))
|
||||||
if [ $count -eq $number ]; then
|
if [ $count -eq $number ]; then
|
||||||
echo $(echo "$line" | awk '{print $1}')
|
echo "$name"
|
||||||
return 0
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done < <(docker ps -a --format "table {{.Names}}" | tail -n +2)
|
done
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# 重启容器
|
|
||||||
restart_container() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${YELLOW}重启容器: $container_name${NC}"
|
|
||||||
|
|
||||||
if docker restart "$container_name" &> /dev/null; then
|
|
||||||
log "容器重启成功: $container_name"
|
|
||||||
else
|
|
||||||
error "容器重启失败: $container_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 停止容器
|
|
||||||
stop_container() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${YELLOW}停止容器: $container_name${NC}"
|
|
||||||
|
|
||||||
if docker stop "$container_name" &> /dev/null; then
|
|
||||||
log "容器停止成功: $container_name"
|
|
||||||
else
|
|
||||||
error "容器停止失败: $container_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 启动容器
|
|
||||||
start_container() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${YELLOW}启动容器: $container_name${NC}"
|
|
||||||
|
|
||||||
if docker start "$container_name" &> /dev/null; then
|
|
||||||
log "容器启动成功: $container_name"
|
|
||||||
else
|
|
||||||
error "容器启动失败: $container_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 删除容器
|
|
||||||
remove_container() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${RED}删除容器: $container_name${NC}"
|
|
||||||
|
|
||||||
# 检查容器是否在运行
|
|
||||||
if docker ps | grep -q "$container_name"; then
|
|
||||||
warning "容器正在运行,先停止再删除"
|
|
||||||
docker stop "$container_name" &> /dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
if docker rm "$container_name" &> /dev/null; then
|
|
||||||
log "容器删除成功: $container_name"
|
|
||||||
else
|
|
||||||
error "容器删除失败: $container_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 强制删除容器
|
|
||||||
force_remove_container() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${RED}强制删除容器: $container_name${NC}"
|
|
||||||
|
|
||||||
if docker rm -f "$container_name" &> /dev/null; then
|
|
||||||
log "容器强制删除成功: $container_name"
|
|
||||||
else
|
|
||||||
error "容器强制删除失败: $container_name"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 查看容器日志
|
|
||||||
view_logs() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${BLUE}查看容器日志: $container_name${NC}"
|
|
||||||
echo "按 Ctrl+C 退出日志查看"
|
|
||||||
|
|
||||||
docker logs -f --tail=50 "$container_name"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 查看容器详细信息
|
|
||||||
inspect_container() {
|
|
||||||
local container_name=$1
|
|
||||||
echo -e "\n${CYAN}容器详细信息: $container_name${NC}"
|
|
||||||
|
|
||||||
docker inspect "$container_name" | grep -E "(Name|Status|Running|IPAddress|Ports|Image)" | head -10
|
|
||||||
}
|
|
||||||
|
|
||||||
# 清理无用容器
|
|
||||||
cleanup_containers() {
|
|
||||||
echo -e "\n${YELLOW}清理已停止的容器...${NC}"
|
|
||||||
local stopped_count=$(docker ps -aq -f status=exited | wc -l)
|
|
||||||
|
|
||||||
if [ "$stopped_count" -gt 0 ]; then
|
|
||||||
docker container prune -f
|
|
||||||
log "已清理 $stopped_count 个已停止的容器"
|
|
||||||
else
|
|
||||||
log "没有已停止的容器需要清理"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 显示系统资源
|
|
||||||
show_resources() {
|
|
||||||
echo -e "\n${CYAN}=== 系统资源使用 ===${NC}"
|
|
||||||
docker system df
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 主菜单
|
# 主菜单
|
||||||
@@ -225,85 +66,91 @@ main_menu() {
|
|||||||
clear
|
clear
|
||||||
echo -e "${BLUE}"
|
echo -e "${BLUE}"
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
echo " Docker 容器管理工具"
|
echo " 简单 Docker 容器管理"
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
echo -e "${NC}"
|
echo -e "${NC}"
|
||||||
|
|
||||||
# 显示容器列表
|
|
||||||
show_containers
|
show_containers
|
||||||
local container_count=$?
|
|
||||||
|
|
||||||
echo -e "${BLUE}操作选项:${NC}"
|
echo -e "${BLUE}操作选项:${NC}"
|
||||||
echo "1. 重启容器"
|
echo "1. 启动容器"
|
||||||
echo "2. 停止容器"
|
echo "2. 停止容器"
|
||||||
echo "3. 启动容器"
|
echo "3. 重启容器"
|
||||||
echo "4. 删除容器"
|
echo "4. 删除容器"
|
||||||
echo "5. 强制删除容器"
|
echo "5. 批量删除已停止容器"
|
||||||
echo "6. 查看容器日志"
|
echo "6. 查看容器日志"
|
||||||
echo "7. 查看容器详情"
|
|
||||||
echo "8. 清理已停止容器"
|
|
||||||
echo "9. 查看系统资源"
|
|
||||||
echo "0. 退出"
|
echo "0. 退出"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
read -p "请选择操作 [0-9]: " choice
|
read -p "请选择操作: " choice
|
||||||
|
|
||||||
case $choice in
|
case $choice in
|
||||||
1|2|3|4|5|6|7)
|
1|2|3|4|6)
|
||||||
if [ "$container_count" -eq 0 ]; then
|
echo
|
||||||
error "没有可用的容器"
|
|
||||||
read -p "按回车键继续..."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -p "请输入容器编号: " container_number
|
read -p "请输入容器编号: " container_number
|
||||||
|
|
||||||
if ! [[ "$container_number" =~ ^[0-9]+$ ]]; then
|
|
||||||
error "无效的编号"
|
|
||||||
read -p "按回车键继续..."
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
container_name=$(get_container_name $container_number)
|
container_name=$(get_container_name $container_number)
|
||||||
if [ -z "$container_name" ]; then
|
if [ -z "$container_name" ]; then
|
||||||
error "容器编号不存在"
|
echo -e "${RED}容器编号不存在${NC}"
|
||||||
read -p "按回车键继续..."
|
read -p "按回车键继续..."
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case $choice in
|
case $choice in
|
||||||
1) restart_container "$container_name" ;;
|
1)
|
||||||
2) stop_container "$container_name" ;;
|
echo -e "${YELLOW}启动容器: $container_name${NC}"
|
||||||
3) start_container "$container_name" ;;
|
docker start "$container_name" && echo -e "${GREEN}启动成功${NC}" || echo -e "${RED}启动失败${NC}"
|
||||||
4) remove_container "$container_name" ;;
|
;;
|
||||||
5) force_remove_container "$container_name" ;;
|
2)
|
||||||
6) view_logs "$container_name" ;;
|
echo -e "${YELLOW}停止容器: $container_name${NC}"
|
||||||
7) inspect_container "$container_name" ;;
|
docker stop "$container_name" && echo -e "${GREEN}停止成功${NC}" || echo -e "${RED}停止失败${NC}"
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
echo -e "${YELLOW}重启容器: $container_name${NC}"
|
||||||
|
docker restart "$container_name" && echo -e "${GREEN}重启成功${NC}" || echo -e "${RED}重启失败${NC}"
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
echo -e "${RED}删除容器: $container_name${NC}"
|
||||||
|
read -p "确认删除?(y/N): " confirm
|
||||||
|
if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then
|
||||||
|
docker rm -f "$container_name" && echo -e "${GREEN}删除成功${NC}" || echo -e "${RED}删除失败${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}取消删除${NC}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
6)
|
||||||
|
echo -e "${BLUE}查看容器日志: $container_name${NC}"
|
||||||
|
echo "按 Ctrl+C 退出"
|
||||||
|
docker logs -f "$container_name"
|
||||||
|
continue # 日志查看后直接继续,不等回车
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
8)
|
5)
|
||||||
cleanup_containers
|
echo -e "${YELLOW}批量删除已停止的容器...${NC}"
|
||||||
;;
|
stopped_count=$(docker ps -aq -f status=exited | wc -l)
|
||||||
9)
|
if [ $stopped_count -gt 0 ]; then
|
||||||
show_resources
|
docker rm $(docker ps -aq -f status=exited)
|
||||||
|
echo -e "${GREEN}已删除 $stopped_count 个已停止容器${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}没有已停止的容器${NC}"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
0)
|
0)
|
||||||
echo
|
echo
|
||||||
log "再见!"
|
echo -e "${GREEN}再见!${NC}"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
error "无效选择"
|
echo -e "${RED}无效选择${NC}"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$choice" -ne 6 ]; then
|
|
||||||
echo
|
echo
|
||||||
read -p "按回车键继续..."
|
read -p "按回车键继续..."
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
# 脚本入口
|
# 启动脚本
|
||||||
check_docker
|
check_docker
|
||||||
main_menu
|
main_menu
|
||||||
|
|||||||
Reference in New Issue
Block a user