一、停止正在运行的容器
# !/bin/bash
# 停止正在运行的容器
# Create : 2021-08-25
# Update : 2021-08-25
# @Autor : wuduoqiang
# 容器名
containerName='mongo'
if [ `docker ps -aq -f 'name='$containerName'' | wc -l` -ge 1 ];
then
echo '容器'$containerName'运行中,停止容器'
docker stop $(docker ps -aq -f 'name='$containerName'') && docker rm $(docker ps -aq -f'name='$containerName'')
else
echo '容器'$containerName'不存在,无需停止'
fi
二、生成TLS和CA证书
auto-generate-docker-tls-ca.sh
# !/bin/bash
# 一键生成TLS和CA证书
# Create : 2021-08-25
# Update : 2021-08-25
# @Autor : wuduoqiang
# 服务器主机名
SERVER="6c377ffb8e86"
# 密码
PASSWORD="123456"
# 国家
COUNTRY="CN"
# 省份
STATE="海南省"
# 城市
CITY="海口市"
# 机构名称
ORGANIZATION="小强崽公司"
# 机构单位
ORGANIZATIONAL_UNIT="小强崽单位"
# 邮箱
EMAIL="875667601@qq.com"
# 生成CA密钥
openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 2048
# 生成CA证书
openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca-cert.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL"
# 生成服务端密钥
openssl genrsa -out server-key.pem 2048
# 生成服务端证书签名的请求文件
openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server-req.csr
# 生成服务端证书
openssl x509 -req -days 3650 -in server-req.csr -CA ca-cert.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem
# 生成客户端密钥
openssl genrsa -out client-key.pem 2048
# 生成客户端证书签名的请求文件
openssl req -subj '/CN=client' -new -key client-key.pem -out client-req.csr
# 生成客户端证书
sh -c 'echo "extendedKeyUsage=clientAuth" >> extfile.cnf'
openssl x509 -req -days 3650 -in client-req.csr -CA ca-cert.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out client-cert.pem -extfile extfile.cnf
# 更改密钥权限
chmod 0400 ca-key.pem server-key.pem client-key.pem
# 更改证书权限
chmod 0444 ca-cert.pem server-cert.pem client-cert.pem
# 删除无用文件
# rm ca-cert.srl client-req.csr server-req.csr extfile.cnf
三、数据库MySQL备份脚本
# !/bin/bash
# 作者:吴多强
# 时间:2020-12-06
# 描述:Docker一键备份MySQL
# 备份数据存放的位置
backupFolder=/home/qiang/data/mysql
# 备份的数据库名,以空格和双引号为一个库
mysqlName=("navigation_prod" "mail_prod" "pavilion_prod" "nacos_prod")
# Docker启动MySQL的容器名称
dockerName=mysql
# 数据库的账号
mysqlUsername=root
# 数据库的密码
mysqlPassword=123456
# 数据库的地址
mysqlUrl=192.168.1.10
# 数据库的端口
mysqlPort=3306
# 备份模式 1:docker 2:mysqldump
backupType=2
# 要备份的数量,会自动删掉旧的备份
needBackupNumber=10
# 日志存放的目录
logFolder=/var/log/mysql
# 系统的日志信息
messages=/var/log/messages
# 日志信息的文件
logFile=$logFolder/`date '+%Y%m%d'`.log
# 判断日志存放目录是否存在,不存在则创建
if [ -e $logFolder ];
then
echo "日志的目录存在,无需创建$logFolder" >> $messages
else
echo "日志目录不存在,正在创建$logFolder" >> $messages
mkdir -p $logFolder
if [ $? -eq 0 ];
then
echo "创建$logFolder目录成功,请查看日志" >> $messages
else
echo "创建$logFolder目录失败,请检查配置" >> $messages
exit
fi
fi
# 判断备份数据目录是否存在,不存在则创建
if [ -e $backupFolder ];
then
echo "备份的目录存在,无需创建$backupFolder" >> $messages
else
echo "备份目录不存在,正在创建$backupFolder" >> $messages
mkdir -p $backupFolder
if [ $? -eq 0 ];
then
echo "创建$backupFolder目录成功,请查看日志" >> $messages
else
echo "创建$backupFolder目录失败,请检查配置" >> $messages
exit
fi
fi
# 判断数据库名目录是否存在,不存在则创建
for i in "${!mysqlName[@]}";
do
if [ -e $backupFolder/${mysqlName[$i]} ];
then
echo "名称的目录存在,无需创建$backupFolder/${mysqlName[$i]}" >> $messages
else
echo "名称目录不存在,正在创建$backupFolder/${mysqlName[$i]}" >> $messages
mkdir -p $backupFolder/${mysqlName[$i]}
if [ $? -eq 0 ];
then
echo "创建$backupFolder/${mysqlName[$i]}目录成功,请查看日志" >> $messages
else
echo "创建$backupFolder/${mysqlName[$i]}目录失败,请检查配置" >> $messages
exit
fi
fi
done
# 开始备份
echo "=========================开始备份=========================" >> $logFile
echo "备份的开始时间: "`date '+%Y-%m-%d %H:%M:%S'` >> $logFile
for i in "${!mysqlName[@]}";
do
# 备份数据库的日期格式 2020-12-06-18-23-25
dateFormat=`date '+%Y-%m-%d-%H-%M-%S'`
# 备份的数据库完整名
backupMysqlName=$backupFolder/${mysqlName[$i]}/${mysqlName[$i]}-$dateFormat.sql
echo "正在备份数据库${mysqlName[$i]}" >> $logFile
# 备份类型
if [ $backupType -eq 1 ];
then
# docker备份
# 定时任务需要去掉-it,也不出现密码警告不安全了,所以无需sed去掉第一行了,直接将数据输入到sql文件
docker exec $dockerName mysqldump -u$mysqlUsername -p$mysqlPassword --databases ${mysqlName[$i]} > $backupMysqlName
else
# mysqldump备份
# 单独安装mysqldump的用法
mysqldump -h$mysqlUrl -P$mysqlPort -u$mysqlUsername -p$mysqlPassword --databases ${mysqlName[$i]} > $backupMysqlName
fi
if [ $? -eq 0 ];
then
echo "备份$backupMysqlName数据成功" >> $logFile
else
echo "备份$backupMysqlName数据失败" >> $logFile
exit
fi
done
echo "备份的完成时间: "`date '+%Y-%m-%d %H:%M:%S'` >> $logFile
echo "=========================备份完成=========================" >> $logFile
# 删除备份
echo "=========================删除备份=========================" >> $logFile
echo "删除的开始时间: "`date '+%Y-%m-%d %H:%M:%S'` >> $logFile
for i in "${!mysqlName[@]}";
do
# 数据库的当前备份数量
currentBackupNumber=`find $backupFolder/${mysqlName[$i]} -name '*.sql' | wc -l`
if [ $currentBackupNumber -le $needBackupNumber ];
then
echo "${mysqlName[$i]}当前的备份数$currentBackupNumber小于等于需要备份数$needBackupNumber,无需删除备份" >> $logFile
else
# 需要删除的备份数量,通过时间排序删除最旧的版本
deleteNumber=`expr $currentBackupNumber - $needBackupNumber`
echo "${mysqlName[$i]}当前的备份数$currentBackupNumber大于需要备份的数量$needBackupNumber,需要删除备份$deleteNumber" >> $logFile
echo "当前${mysqlName[$i]}备份:" >> $logFile
echo "`find $backupFolder/${mysqlName[$i]} -name '*.sql' | xargs ls -lta | grep ^[^d] | awk '{print $9}'`" >> $logFile
echo "删除${mysqlName[$i]}备份:" >> $logFile
# 需要删除的备份名称
deleteName=`find $backupFolder/${mysqlName[$i]} -name '*.sql' | xargs ls -lta | grep ^[^d] | awk '{print $9}' | tail -$deleteNumber` >> $logFile
echo "$deleteName" >> $logFile
rm -rf $deleteName
if [ $? -eq 0 ];
then
echo "删除${mysqlName[$i]}成功。" >> $logFile
else
echo "删除${mysqlName[$i]}失败。" >> $logFile
exit
fi
fi
done
echo "删除的完成时间: "`date '+%Y-%m-%d %H:%M:%S'` >> $logFile
echo "=========================删除完成=========================" >> $logFile