Docker容器日志备份方案

需求背景:
由于docker容器每次重新构建后,日志都会丢失 导致没法追溯,定位故障等,痛!

需求实现:
本次采用Shell脚本+systemd服务来启动和管理服务

一、创建脚本docker-log.sh

#!/bin/bash

# 设定备份时间间隔为30秒
BACKUP_INTERVAL=30

# 设定保留备份文件的天数
RETAIN_DAYS=3

# 设定日志文件名
LOG_FILE="/var/log-bak/backup.log"

# 设定上次备份时间文件名
LAST_TIME_FILE="/var/log-bak/last_time.txt"

# 设定日志目录为当天的日期
LOG_DIR="/var/log-bak/$(date +%Y%m%d)"

if [ ! -d "$LOG_DIR" ]; then
  # 如果日志目录不存在,则创建该目录
  mkdir -p "$LOG_DIR"
fi

if [ ! -f "$LAST_TIME_FILE" ]; then
  # 如果上次备份时间文件不存在,则创建该文件,并写入当前时间和容器名
  touch "$LAST_TIME_FILE"
  for CONTAINER_NAME in $(docker ps --format "{{.Names}}"); do
    echo "$CONTAINER_NAME $(date +%s)" >> "$LAST_TIME_FILE"
  done
fi

while true; do
# **重新设定日志目录为当前日期**
   LOG_DIR="/var/log-bak/$(date +%Y%m%d)"

   if [ ! -d "$LOG_DIR" ]; then
     # 如果日志目录不存在,则创建该目录
     mkdir -p "$LOG_DIR"
   fi

  # 循环遍历docker中所有容器名和对应的容器ID
  for CONTAINER_NAME in $(docker ps --format "{{.Names}}"); do

    # 定义备份文件名
    LOG_BACKUP_FILE="${LOG_DIR}/${CONTAINER_NAME}.log"

    if [ ! -f "$LOG_BACKUP_FILE" ]; then
      # 如果备份文件不存在,则创建该文件
      touch "$LOG_BACKUP_FILE"
    fi

    # 从上次备份时间文件中读取对应容器的最后一次备份时间,并赋值给LAST_TIME变量
    LAST_TIME=$(grep "$CONTAINER_NAME" "$LAST_TIME_FILE" | tail -n 1 | cut -d ' ' -f 2)

    # 通过docker logs命令获取自上次备份时间以来新增的日志并追加到备份文件中
    docker logs --timestamps --since "$LAST_TIME" "$CONTAINER_NAME" >> "$LOG_BACKUP_FILE"
    # 向日志文件中写入备份的容器名和时间
    echo "[$(date)] Backed up $CONTAINER_NAME log to $LOG_BACKUP_FILE" >> "$LOG_FILE"
    # 更新上次备份时间为当前时间,并写入到上次备份时间文件中,附带容器名
    echo "$CONTAINER_NAME $(date +%s)" >> "$LAST_TIME_FILE"
  done

  # 删除过期的备份文件,只保留最近3天的备份文件,并向日志文件中写入删除的文件名和时间
  find /var/log-bak/202*/ -type f -mtime +$RETAIN_DAYS -delete -print | xargs -I {} echo "[$(date)] Deleted expired backup file {}" >> "$LOG_FILE"

  # 休眠备份时间间隔后继续下一轮备份
  sleep $BACKUP_INTERVAL
done

二、创建/etc/systemd/system/log-backup.service文件

[Unit]
Description=Log backup service
After=docker.service

[Service]
User=root
WorkingDirectory=/var/log-bak
ExecStart=/bin/bash /var/log-bak/docker-log.sh
PIDFile=/var/run/log-backup.pid
ExecStartPre=/bin/rm -f /var/run/log-backup.pid
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

配置解释:
User 指定了执行该服务的用户
WorkingDirectory 指定了服务工作目录
ExecStart 指定了要执行的Shell脚本
Restart和RestartSec 指定了服务重启的策略
After 指定了服务依赖项,这里设置为docker.service,表示在Docker服务启动后再启动该服务
PIDFile 确保每次只有一个实例在运行
ExecStartPre 会在服务启动前删除旧的PID文件

三、服务管理

systemctl daemon-reload     # 重新加载systemd配置文件
systemctl enable log-backup # 启用服务自启动
systemctl start log-backup  # 启动服务
systemctl stop log-backup   # 停止服务
systemctl disable log-backup # 禁用服务自启动
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
docker mysql 定时备份脚本可以通过在Docker容器中运行CRON任务来实现。在提供的引用内容中,并没有直接包含docker mysql定时备份脚本的详细说明。但是,我们可以根据提供的资源包含了MySQL的配置文件和一些其他脚本文件,来组合实现定时备份脚本。 下面是一种可能的实现方法: 1. 首先,进入Docker容器中的MySQL配置文件目录,并修改my.cnf文件来启用MySQL的binlog。在binlog中记录的操作日志可以用于恢复数据库到指定的时间点。 2. 接下来,创建一个备份脚本文件,将其保存为backup.sh或者其他指定名称。该脚本文件将执行MySQL备份的操作。脚本内容大致如下: ``` #!/bin/bash # 设置备份目录 BACKUP_DIR=/path/to/backup # 设置备份文件名 BACKUP_FILE=mysql_backup_$(date +%Y%m%d%H%M%S).sql # 执行备份命令 mysqldump -u <username> -p<password> -h <host> --all-databases > $BACKUP_DIR/$BACKUP_FILE ``` 3. 接下来,创建一个定时任务脚本文件,将其保存为cron.sh或者其他指定名称。该脚本文件将设置定时任务,并执行备份脚本。脚本内容大致如下: ``` #!/bin/bash # 设置定时任务执行频率,例如每天凌晨3点执行备份 CRON_SCHEDULE="0 3 * * *" # 设置备份脚本文件路径 BACKUP_SCRIPT=/path/to/backup.sh # 添加定时任务 echo "$CRON_SCHEDULE root $BACKUP_SCRIPT" >> /etc/crontab # 重新加载cron服务 service cron reload ``` 4. 最后,通过在Docker容器中运行cron.sh脚本,即可设置定时任务并执行备份操作。 ``` $ sh cron.sh ``` 需要注意的是,以上脚本内容仅为示例,具体的配置和操作需要根据实际情况进行调整。 参考资料: 提供的资源包含的Spark集群配置文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值