用shell脚本批量启动docker容器

本文详细介绍了如何使用Shell脚本批量启动和关闭Docker容器,并实现容器的自动启动。通过编写GetContainerStatus和startContainer等功能函数,检查容器状态并执行相应的操作。同时,讲解了如何配置`crontab`进行定时任务设置,确保容器按需自动启动,适合Docker自动化运维场景。
摘要由CSDN通过智能技术生成

1 前置知识

1.在脚本中运行docker命令要在命令前加sudo.
2.docker查看容器是否正在运行,正在运行返回1,没有返回0。
3.if和中括号[ ]之间,中括号和里面的内容也要空格隔开。
4.声明变量时等号两边不能有空格示例:a=1
5.函数返回值用echo返回可以直接用变量=$(函数名)接收,如果用return 返回则存放在$?中用变量=$?接收

docker ps |grep -i 容器名或容器id -c
  1. 抓取某个进程的PID其中容器名su-nacos可以换成容器id,用于查看容器是否正在运行。
docker stats --format "{{.PIDs}} " --no-stream su-nacos

3.用于查看上一个进程或函数的返回值$?

2 容器的自动启动脚本

1 注意事项

1.建议配置前把容器全部重命名为软件名,修改示例如下:

docker rename smysql mysql

2.新建一个.txt文本文件,把下面的脚本复制到一个文件中。
3.在xshell中使用which bash 命令查看bash命令所在的文件夹,和脚本中的第一行/user/bin/bash进行比较,相同就不变,不相同的话修改为查询到的路径。
4.修改脚本中第二行containerNames="nacos ssdb rabbit mysql minio "数组中博主使用的容器名,改为你自己想要启动的容器名。
5.把文件后缀名改为.sh,然后放入linux任意目录下,方便就行。
6.设置脚本文件的权限,示例:chmod +x docker.sh
7.在你存放脚本的目录下启动脚本,以后每天只需要做这一步就行了。

sh docker.sh

2 启动脚本

因为用$()接收startContainer函数的返回值返回值会报容器名: command not found的错误(值时运行docker命令才会报错,但是不影响运行,其它正常),所以此处用startContainer $containerName &> /dev/null,把startContainer函数的返回值后台输出到/dev/null文件夹内(为了控制台美观不输出太多字)。

1 某些含义

0 代表docker中有该容器,且未启动。
1 代表docker中有该容器,但是已经启动了。
2 代表docker中没有该容器。

#!  /user/bin/bash
containerNames="ssdb rabbit "
function GetContainerStatus(){
	containerExist=$(sudo docker ps -a |grep -i $1 -c)
	if [  $containerExist != 0 ] ; 
		then
			pid=$(sudo docker stats --format "{{.PIDs}}" --no-stream $1)
		if [ $pid -eq 0 ];
			then				
				return  0
			else				
				return  1
		fi
	else
		
		return 2	
	fi
}

function startContainer(){
	sudo docker restart  $1
}


for containerName in $containerNames
	do
		for((i=1; i<=3; i++))
	do
		$(GetContainerStatus $containerName)
		statues=$?
	if [ $statues -eq 1 ];
		then
			echo -e  "\033[31m  the container named  $containerName  is started    \033[0m" 
			break
	fi
	if [ $statues -eq 2 ];
		then
			echo -e  "\033[31m container which named  $containerName  is not exit    \033[0m"				
			break
	fi
	if [  $statues -eq 0 ] ;
		then
			echo -e  "\033[33m container  $containerName  is preparing to start ......  \033[0m" 
			startContainer $containerName &> /dev/null
			$(GetContainerStatus $containerName)
			varifyStatus=$?
				if [ $varifyStatus -eq 1  ];
					then
						echo -e  "\033[32m  container  $containerName started success   \033[0m"
						break
					else
						echo -e  "\033[33m   container  $containerName  retry start......  \033[0m"
						$(startContainer $containerName)
				fi
	fi
	done
done

3 关闭脚本

和启动脚本类似,按照第二节的来就行

1 某些含义
#!  /user/bin/bash
containerNames="ssdb rabbit "
function GetContainerStatus(){
	containerExist=$(sudo docker ps -a |grep -i $1 -c)
	if [  $containerExist != 0 ] ; 
		then
			pid=$(sudo docker stats --format "{{.PIDs}}" --no-stream $1)
		if [ $pid -eq 0 ];
			then				
				return  0
			else				
				return  1
		fi
	else
		
		return 2	
	fi
}

function stopContainer(){
	sudo docker stop  $1
}


for containerName in $containerNames
	do
		for((i=1; i<=3; i++))
	do
		$(GetContainerStatus $containerName)
		statues=$?
	if [ $statues -eq 0 ];
		then
			echo -e  "\033[31m  the container named  $containerName  is stoped    \033[0m" 
			break
	fi
	if [ $statues -eq 2 ];
		then
			echo -e  "\033[31m container which named  $containerName  is not exit    \033[0m"				
			break
	fi
	if [  $statues -eq 1 ] ;
		then
			echo -e  "\033[33m container  $containerName  is preparing to stop......  \033[0m" 
			stopContainer $containerName &> /dev/null
			$(GetContainerStatus $containerName)
			varifyStatus=$?
				if [ $varifyStatus -eq 0  ];
					then
						echo -e  "\033[32m  container  $containerName stoped success   \033[0m"
						break
					else
						echo -e  "\033[33m   container  $containerName  retry stop......  \033[0m"
						$(stopContainer $containerName)
				fi
	fi
	done
done

4 设置脚本的定时启动

1 安装crontab(一搬都自带)

yum install  vixie-cron
yum install  crontabs

2 crontab的命令

systemctl start crond.service  //启动服务
systemctl stop crond.service  //关闭服务
systemctl restart crond.service  //重启服务
systemctl reload crond.service  //重新载入配置
systemctl status crond.service   //查看状态

//或者
crond start
crond stop
crond restart
crond reload
crond status

启动时出现如下情况就用这个命令rm -rf /var/run/crond.pid
在这里插入图片描述

3 crontab的命令格式

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 
minute: 区间为 0 – 59 
hour: 区间为0 – 23 
day-of-month: 区间为0 – 31 
month: 区间为1 – 12. 1 是1月. 12是12月. 
Day-of-week: 区间为0 – 7. 周日可以是0或7.

4 crontab的命令示例

1、在 凌晨02:00运行

0 2 * * * /home/linrui/XXXX.sh

2、每个工作日22:00都进行备份作业。

0 10 * * 1,2,3,4,5 /home/linrui/XXXX.sh   

0 10 * * 1-5 /home/linrui/XXXX.sh

3、每10分钟运行一次命令

*/10 * * * * /home/linrui/XXXX.sh

4、每个月的1号 15:30 运行

30 15 1 * * /home/linrui/XXXX.sh

5 docker容器定时启动配置

1 添加定时任务的两种方式(任意位置使用)。

1.针对某个用户添加定时任务

crontab -e

2.针对系统添加任务

vim /etc/crontab

2 设置时间格式为24小时制

1 输入命令tzselect

根据提示选择:
5 --> 9–>1–>1–>ok

2 输入命令rm /etc/localtime,然后回车
3 输入命令ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
4 输入命令date,查看时间格式

3 添加定时任务

1 第一步
crontab -e
2 crontabs

1.激活crontabs

systemctl start crond.service

2.查看crontabs状态

service crond status
3 赋予脚本最大权限
chmod -R 777  start.sh
4 设置脚本自动启动(任何目录下执行)

设置每天早上9.10分启动start.sh脚本
其中/usr/bin/bash时bash命令的存放路径,是用来执行脚本的环境变量,which bash可找出没有这个的话会报错,导致脚本不能被执行。

 10 9 *  *  * /usr/bin/bash  /mysoft/start.sh >/mysoft/log.txt

格式如下
在这里插入图片描述

5 查看是否添加成功
crontab -l
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值