文章目录
使用场景
- 我们的平台使用
docker
部署,使用docker-compose
进行管理 - 平台部署到客户环境后,一部分小客户,使用自己机房或单独的服务器,有时候会断电重启
- 断电重启后,服务要能自动拉起来。首先docker服务要开机自启动,平台也要开机自启动
重启脚本
- 首先将docker服务,加入开机自启动
systemctl enable docker
- 然后编写平台服务重启脚本
docker-restart.sh
,主要是根据自己的应用情况,搞一个启动顺序
#!/bin/bash
cd /home
echo '当前目录为:'$(pwd)
if cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
then
echo "已加入重启脚本"
else
echo "将docker服务重启加入服务器重启脚本"
chmod +x /etc/rc.d/rc.local
chmod +x $(pwd)/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh $(pwd)/docker-restart.sh &
EOF
fi
docker network create signal-network
echo '开始重启服务'
echo '当前目录为:'$(pwd)
cd signal/instance/
docker-compose --compatibility up -d postgresql zookeeper redis portainer
echo "为保证中间件创建完成启动成功,等待5秒"
sleep 5s
echo '开始创建其他需要的容器,请稍等,可能需要几分钟'
docker-compose --compatibility up -d keycloak kafka consul consul-config-loader
sleep 15s
docker-compose --compatibility up -d gateway-app unit-app data-center-app
sleep 25s
docker-compose --compatibility up -d
sleep 15s
docker restart nginx
echo '当前目录为:'$(pwd)
echo '所有命令执行完成,请稍等1分钟后,访问ip地址,查看界面是否正常展示!'
- 最后,将这个脚本,加入到开机自启动里面。加入方法很多,我采用的是在
/etc/rc.d/rc.local
里写一个执行命令,上面前面几行就是干这个的
if cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
then
echo "已加入重启脚本"
else
echo "将docker服务重启加入服务器重启脚本"
chmod +x /etc/rc.d/rc.local
chmod +x /home/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh /home/docker-restart.sh &
EOF
fi
脚本介绍
- 就是一个普通的shell脚本,脚本里都是最基础的一些命令
- 我下面把我的脚本里用到的一些函数简单介绍下
判断文件内容是否包含某字符串
cat '/etc/rc.d/rc.local' | grep "/home/docker-restart" > /dev/null
cat 'file path and name' | grep "your str" > /dev/null
- 主要使用
cat
和grep
,前面是文件路径和名称,我用的绝对路径;后面是要查找的字符串 - 然后再进行判断
> /dev/null
,包含则为true,不包含为false
给文件添加可执行权限
chmod +x /etc/rc.d/rc.local
这句命令会给/etc/rc.d/rc.local
文件添加可执行权限- 赋予权限后,在系统启动时,系统会自动执行该文件中的命令
- 通过给该文件添加可执行权限,可以实现开机自启动某些自定义命令或服务
- 但是请注意,该操作需要谨慎处理,避免不必要的安全风险或系统故障
给文件结尾添加内容
- 主要使用
cat
写入
cat >>/etc/rc.d/rc.local<<EOF
sh /home/docker-restart.sh &
EOF
sh
后面加&
,是为了后台启动,不影响开机速度
根据内容删除文件的指定行
- 在早期部署时,重启脚本还不完善,在
/etc/rc.d/rc.local
添加了错误内容 - 例如:应该是添加
sh /home/docker-restart.sh &
,结果使用相对位置,加了sh /root/docker-restart.sh &
,而文件在home目录下,开机启动时执行不到,服务就没有重启 - 还有的客户机器配置比较差,服务启动过程较慢,一开始写入
/etc/rc.d/rc.local
的是sh /home/docker-restart.sh
,没有后面加&
,导致系统一直在启动中,客户看到进度卡死(实际上在启动平台)又去重启 - 因为客户都是内网环境,也没有专业运维,给客户更新部署时,是提供自带脚本的部署包。客户上传文件,执行脚本即可,让客户去使用命令改文件,有点困难
- 需要一个命令,查找指定行,并删除,这个也有很多方法,我使用的是
sed
if cat '/etc/rc.d/rc.local' | grep "docker-restart" > /dev/null
then
sed -i '/docker-restart/d' /etc/rc.d/rc.local
fi
echo "将docker服务重启加入服务器重启脚本"
chmod +x /etc/rc.d/rc.local
chmod +x $(pwd)/docker-restart.sh
cat >>/etc/rc.d/rc.local<<EOF
sh $(pwd)/docker-restart.sh &
EOF