用shell脚本批量启动docker容器
1 前置知识
1.在脚本中运行docker
命令要在命令前加sudo
.
2.docker查看容器是否正在运行,正在运行返回1,没有返回0。
3.if和中括号[ ]
之间,中括号和里面的内容也要空格隔开。
4.声明变量时等号两边不能有空格示例:a=1
。
5.函数返回值用echo
返回可以直接用变量=$(函数名)
接收,如果用return 返回则存放在$?
中用变量=$?
接收
docker ps |grep -i 容器名或容器id -c
- 抓取某个进程的
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