代码 一键式操作以简化Docker的日常管理

2024-11-19 07:01:44 +0800 CST views 508

Docker管理Shell脚本:一键操作,轻松管理!

本脚本基于Docker基础管理,旨在提供一键式操作以简化Docker的日常管理工作。它涵盖了从Docker的安装、镜像管理、容器管理到服务控制等常见操作。

脚本功能简介

  1. 检测是否已安装Docker
    检查系统中是否已安装Docker,若未安装,则自动下载并配置。

  2. 启停Docker服务
    启动、停止或重启Docker服务,保证服务的正常运行。

  3. 查看正在运行的容器
    列出当前正在运行的所有容器。

  4. 查看当前网络模式
    显示Docker当前的网络模式及其配置信息。

  5. 批量拉取镜像
    一次性批量拉取常用镜像,如centosnginxmysql等。

  6. 批量删除镜像
    删除未使用的镜像或清理所有镜像。

  7. 批量启动容器
    启动已停止的容器,确保服务的快速恢复。

  8. 批量删除容器
    删除未启动或所有的容器,以清理系统资源。

  9. 检查是否配置了镜像加速器
    检查并配置镜像加速器,以加快镜像拉取速度。

  10. 卸载Docker
    完全卸载Docker,并清理相关数据和配置文件。

  11. 列出本地所有的镜像
    列出本地存储的所有Docker镜像。

  12. 查看已停止运行的容器
    列出所有已停止运行的容器,方便管理和清理。

  13. 查看容器的磁盘使用情况
    显示容器的磁盘使用详情,包括镜像、容器、卷和缓存的大小及可释放空间。

完整脚本代码

#!/bin/bash
# **********************************************************
# * Author        : 青菜浪人
# * Create time   : 2023-10-23 16:16
# * Filename      : docker_manager.sh
# * Description   : Docker管理Shell脚本
# **********************************************************

function random_color(){
    random_color_code=$((RANDOM % 256))
    echo -e "\033[38;5;${random_color_code}m${1}\033[0m"
}

function check_network() {  
    if ping -c1 -w1 www.baidu.com >/dev/null 2>&1;then
        echo -e "\033[32mnetwork status is healthy\033[0m"
    else
        echo -e "\033[31m网络连接失败,请检查网络环境!\033[0m"
        exit 1
    fi
}

function inspect_docker() {
    if [ ! -f /etc/yum.repos.d/docker-ce.repo ]; then
        echo -e "\033[31mdocker.repo not found\033[0m"
        echo -e "\033[31mDownloading docker.repo\033[0m"
        wget -P /etc/yum.repos.d/ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo >/dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo -e "\033[32m docker-ce.repo下载完成,正在初始化请稍候...\033[0m"
            yum clean all && yum makecache >/dev/null 2>&1
            echo -e "\033[32m 初始化完成\033[0m"
        else
            echo -e "\033[31m 下载失败\033[0m"
            exit 1
        fi
    else
        echo -e "\033[32mdocker.repo has been downloaded\033[0m"
    fi
}

function docker_install() {
    if [ ! -f /usr/bin/docker ]; then
        echo -e "\033[31mdocker not found\033[0m"
        echo -e "\033[32mInstalling docker\033[0m"
        yum install -y yum-utils >/dev/null 2>&1
        yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y >/dev/null 2>&1
        if [ "$?" -eq 0 ];then
            echo -e "\033[32mdocker installed successlly\033[0m"
            systemctl start docker && systemctl enable docker >/dev/null 2>&1
            echo -e "\033[32mDocker started successfully\033[0m"             
        else
            echo -e "\033[31mdocker installation failed\033[0m"
            exit 1
        fi
    else
        echo -e "\033[32mdocker has been installed\033[0m"
    fi
}

function inspect_mirror() {
    if [ ! -f /etc/docker/daemon.json ]; then
        echo -e "\033[31mdocker mirror not found\033[0m"
        read -p "是否现在配置镜像加速器(y/n):" mirror_url
        if [ "$mirror_url" == "y" ]; then
            echo -e "\033[31mConfiguring docker mirror\033[0m"
            read -p "请输入镜像加速器地址:" img_url
            cat >/etc/docker/daemon.json <<EOF
{
    "registry-mirrors": ["${img_url}"]
}
EOF
            systemctl daemon-reload && systemctl restart docker >/dev/null 2>&1
             
        else
            echo -e "\033[31m已取消操作\033[0m"
            exit 1
        fi
        if [ "$?" -eq 0 ];then
            echo -e "\033[32mdocker mirror configured successlly\033[0m"
        else    
            echo -e "\033[31mdocker mirror configuration failed\033[0m"
            exit 1
        fi
    else
        echo -e "\033[32mdocker mirror has been configured\033[0m"
    fi
}

function start_stop_service() {
    read -p "1.启动Docker服务 2.停止Docker服务 3.重启Docker服务:"  docker_start
    case "${docker_start}" in
    1)
        systemctl start docker && systemctl enable docker >/dev/null 2>&1 
        [ "$?" -eq 0 ] && echo -e "\033[32mdocker service started successlly\033[0m" || echo -e "\033[31mdocker service start failed\033[0m"
        ;;
    2)
        systemctl stop docker && systemctl disable docker >/dev/null 2>&1
        [ "$?" -eq 0 ] && echo -e "\033[32mdocker service stopped successlly\033[0m" || echo -e "\033[31mdocker service stop failed\033[0m"
        ;;
    3)
        systemctl restart docker >/dev/null 2>&1
        [ "$?" -eq 0 ] && echo -e "\033[32mdocker service restarted successlly\033[0m" || echo -e "\033[31mdocker service restart failed\033[0m"
        ;;
    *)
        echo -e "\033[31m输入错误,请输入[1-3]的数字\033[0m"
        ;;
    esac
}

function pull_image(){
    
    img=(
        centos
        nginx:1.20.1
        mysql
        redis
    )

    for img_pull in ${img[@]};do
        echo -e "\033[35mPulling (${img_pull}), please wait\033[0m"
        docker pull $img_pull 
        if [ "$?" -eq 0 ];then
            echo -e "\033[32m$img_pull pull success\033[0m"
        else
            echo -e "\033[31m$img_pull pull failed\033[0m"
        fi
    done
}

function img_delete(){
    img=$(docker images --format {{.Repository}}:{{.Tag}})
    for i in ${img}
    do
        if [ -n "$(docker ps -q --filter ancestor=${i})" ] ;then
            echo -e "\033[32mrunning Docker:${i}\033[0m"
        else
            echo -e "\033[31mDeleting an unused mirror:${i}\033[0m" 
            docker rmi ${i} >/dev/null 2>&1
            if [ "$?" -eq 0 ];then
                echo  "此镜像[$i]已删除"
            else
                echo "镜像[$i]删除失败"
            fi
        fi
    done
}

function del_image(){
    read -p "1.删除未在使用的镜像/2.删除所有镜像(包括正在使用的):" delete_img
    if [ "${delete_img}" == "1" ];then
        echo -e "\033[32m正在批量删除未使用的镜像...\033[0m"
        img_delete
    elif [ "${delete_img}" == "2" ];then
        echo -e "\033[33m正在停止

容器...\033[0m"
        stop_img=$(docker ps -a -q)
        docker stop ${stop_img} >/dev/null 2>&1
        echo -e "\033[33m正在删除所有镜像...\033[0m"
        sleep 2
        clear_img=$(docker images -q)
        docker rmi -f ${clear_img} >/dev/null 2>&1
        if [ "$?" -eq 0 ];then
            echo -e "\033[32m镜像删除成功\033[0m"
        else
            echo -e "\033[31m镜像删除失败\033[0m"
            exit 1
        fi
    else
        echo -e "\033[31m输入错误,请重新输入\033[0m"
    fi
}

function del_container(){
    read -p "1.删除未启动的容器/2.删除所有容器(包括正在使用的):" delete_container
    if [ "$delete_container" == "1" ];then
        echo -e "\033[33m正在批量删除未启动的容器...\033[0m"
        docker rm -f $(docker ps -qa --filter status=exited) >/dev/null 2>&1
        if [ "$?" -eq 0 ];then
            echo -e "\033[32m容器删除成功\033[0m"
        else
            echo -e "\033[31m容器删除失败\033[0m"
            exit 1
        fi
    elif [ "$delete_container" == "2" ];then
        echo -e "\033[33m正在批量删除所有容器...\033[0m"
        docker rm -f $(docker ps -qa) >/dev/null 2>&1
        if [ "$?" -eq 0 ];then
            echo -e "\033[32m容器删除成功\033[0m"
        else
            echo -e "\033[31m容器删除失败\033[0m"
            exit 1
        fi
    else
        echo -e "\033[31m输入错误,请重新输入\033[0m"
    fi
}

function uninstall_docker() {
    echo -e "\033[33m正在卸载docker,请稍候...\033[0m"
    yum -y remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin >/dev/null 2>&1
    if [ "$?" -eq 0 ];then
        read -p "是否删除所有镜像、容器、卷、网络?[y/n]" delete_docker
        if [ "$delete_docker" == "y" ];then
            echo -e "\033[32m卸载成功,正在删除所有镜像,容器,卷,网络...\033[0m"
            rm -rf  /var/lib/docker/
        else
            echo -e "\033[31m删除/var/lib/docker/失败\033[0m"
            exit 1
        fi
    else
        echo -e "\033[31m卸载docker失败\033[0m"
        exit 1
    fi
}

function system_docker(){
    img_size=$(docker system df|awk 'NR==2{print $4}')
    img_number=$(docker system df|awk 'NR==2{print $2}')
    img_release=$(docker system df|awk 'NR==2{print $5}')

    containers=$(docker system df|awk 'NR==3{print $2}')
    containers_size=$(docker system df|awk 'NR==3{print $4}')
    containers_release=$(docker system df|awk 'NR==3{print $5}')

    volumes_number=$(docker system df|awk 'NR==4{print $3}')
    volumes_size=$(docker system df|awk 'NR==4{print $5}')
    volumes_release=$(docker system df|awk 'NR==4{print $6}')

    cache_number=$(docker system df|awk 'NR==5{print $3}')
    cache_size=$(docker system df|awk 'NR==5{print $5}')
    cache_release=$(docker system df|awk 'NR==5{print $6}')

    echo -e "\033[35m*****************************************************************************************
\n*当前共有[$img_number]个镜像,占用磁盘空间为:[$img_size],可释放磁盘空间为:[${img_release}]\t\t\t\t*
\n*当前创建了[$containers]个容器,总大小为:[$containers_size],可释放空间为:[${containers_release}]\t\t\t\t\t*
\n*当前定义的本地数据卷共有[$volumes_number]个,占用的磁盘总大小为:[$volumes_size],可释放的磁盘空间为:[$volumes_release]\t\t\t*
\n*当前定义的本地缓存共有[$cache_number]个,占用磁盘总大小为:[$cache_size],可释放的磁盘空间为:[$cache_release]\t\t\t*
\n*****************************************************************************************\033[0m"
}

function menu(){
    echo -e "\033[34m
***************************************************************************************** \
\n*\t1.检测是否已安装Docker\t\t\t\t2.启停Docker服务 \t\t* \
\n\n*\t3.查看正在运行的容器   \t\t\t\t4.查看当前网络模式 \t\t* \
\n\n*\t5.批量拉取镜像          \t\t\t6.批量删除镜像 \t\t\t* \
\n\n*\t7.批量启动容器    \t\t\t\t8.批量删除容器 \t\t\t* \
\n\n*\t9.检查是否配置了镜像加速器   \t\t\t10.卸载Docker     \t\t* \
\n\n*\t11.列出本地所有的镜像\t\t\t    \t12.查看已停止运行的容器\t\t* \
\n\n*\t13.查看容器的磁盘使用情况\t\t\t 0.退出\t\t\t\t*
\n*****************************************************************************************\033[0m"
    
    read -p "请输入要操作的选项:" num
    case "$num" in
    1)
        inspect_docker
        docker_install
        ;;
    2)
        start_stop_service
        ;;
    3)
        docker ps
        ;;
    4)
        docker network ls
        ;;
    5)
        pull_image
        ;;
    6)
        del_image
        ;;
    7)
        docker start $(docker ps -qa --filter status=running)
        if [ "$?" -eq 0 ];then
            echo -e "\033[32m容器启动成功\033[0m"
        else
            echo -e "\033[31m容器启动失败\033[0m"
            exit 1
        fi
        ;;
    8)
        del_container
        ;;
    9)
        inspect_mirror
        ;;
    10)
        uninstall_docker
        ;;
    11)
        docker images
        ;;
    12)
        docker ps -a --filter status=exited
        ;;
    13)
        system_docker
        ;;
    0)
        exit 0
        ;;
    *)
        echo -e "\033[31m输入错误,请重新输入[0-13]的数字\033[0m"
        ;;
    esac
}

echo -e "\033[33m*************Checking the network status****************"
check_network
echo -e "\033[33m*************Checking the docker status****************"
while :
do
    menu
done

使用说明

  1. 将脚本保存为 docker_manager.sh
  2. 为脚本赋予执行权限:chmod +x docker_manager.sh
  3. 运行脚本:./docker_manager.sh
  4. 根据提示选择相应的功能,即可轻松管理Docker服务。

总结

通过这个一键管理脚本,你可以更加便捷地管理Docker环境,提高工作效率,简化日常操作。欢迎根据自身需求进一步定制和优化脚本功能!

复制全文 生成海报 Docker 自动化 脚本 系统管理 开发工具

推荐文章

一键压缩图片代码
2024-11-19 00:41:25 +0800 CST
Vue中的表单处理有哪几种方式?
2024-11-18 01:32:42 +0800 CST
记录一次服务器的优化对比
2024-11-19 09:18:23 +0800 CST
go发送邮件代码
2024-11-18 18:30:31 +0800 CST
网站日志分析脚本
2024-11-19 03:48:35 +0800 CST
Nginx 防止IP伪造,绕过IP限制
2025-01-15 09:44:42 +0800 CST
程序员出海搞钱工具库
2024-11-18 22:16:19 +0800 CST
JavaScript设计模式:组合模式
2024-11-18 11:14:46 +0800 CST
JavaScript设计模式:桥接模式
2024-11-18 19:03:40 +0800 CST
java MySQL如何获取唯一订单编号?
2024-11-18 18:51:44 +0800 CST
JavaScript设计模式:装饰器模式
2024-11-19 06:05:51 +0800 CST
Go语言中的`Ring`循环链表结构
2024-11-19 00:00:46 +0800 CST
Vue3中的JSX有什么不同?
2024-11-18 16:18:49 +0800 CST
Elasticsearch 聚合和分析
2024-11-19 06:44:08 +0800 CST
程序员茄子在线接单