Docker管理Shell脚本:一键操作,轻松管理!
本脚本基于Docker基础管理,旨在提供一键式操作以简化Docker的日常管理工作。它涵盖了从Docker的安装、镜像管理、容器管理到服务控制等常见操作。
脚本功能简介
检测是否已安装Docker
检查系统中是否已安装Docker,若未安装,则自动下载并配置。启停Docker服务
启动、停止或重启Docker服务,保证服务的正常运行。查看正在运行的容器
列出当前正在运行的所有容器。查看当前网络模式
显示Docker当前的网络模式及其配置信息。批量拉取镜像
一次性批量拉取常用镜像,如centos
、nginx
、mysql
等。批量删除镜像
删除未使用的镜像或清理所有镜像。批量启动容器
启动已停止的容器,确保服务的快速恢复。批量删除容器
删除未启动或所有的容器,以清理系统资源。检查是否配置了镜像加速器
检查并配置镜像加速器,以加快镜像拉取速度。卸载Docker
完全卸载Docker,并清理相关数据和配置文件。列出本地所有的镜像
列出本地存储的所有Docker镜像。查看已停止运行的容器
列出所有已停止运行的容器,方便管理和清理。查看容器的磁盘使用情况
显示容器的磁盘使用详情,包括镜像、容器、卷和缓存的大小及可释放空间。
完整脚本代码
#!/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
使用说明
- 将脚本保存为
docker_manager.sh
。 - 为脚本赋予执行权限:
chmod +x docker_manager.sh
。 - 运行脚本:
./docker_manager.sh
。 - 根据提示选择相应的功能,即可轻松管理Docker服务。
总结
通过这个一键管理脚本,你可以更加便捷地管理Docker环境,提高工作效率,简化日常操作。欢迎根据自身需求进一步定制和优化脚本功能!