如何编写一个使用 docker-compose 定时备份远程 MySQL数据库 的 YAML 脚本

20 min read

您可以使用以下 YAML 脚本来编写使用 docker-compose 定时备份远程 MySQL 数据库:

version: '3'

services:
  backup:
    image: mysql:latest
    command: sh -c 'exec mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE > /backup/backup.sql'
    environment:
      MYSQL_HOST: <your-remote-hostname-or-ip-address>
      MYSQL_USER: <your-mysql-username>
      MYSQL_PASSWORD: <your-mysql-password>
      MYSQL_DATABASE: <your-mysql-database-name>
    volumes:
      - ./backup:/backup
      - ./backup-cron:/etc/cron.d/backup-cron
    environment:
      - MYSQL_PWD=$MYSQL_PASSWORD

  cron:
    image: alpine
    volumes:
      - ./backup-cron:/etc/cron.d/backup-cron
    command: crond -f -L /dev/stdout

该脚本包括两个服务:'backup' 和 'cron'。 'backup' 服务使用 mysql:latest 映像,以执行 MySQL 数据库的备份。它使用 name: value 对类似于环境变量的形式,包括 MySQL 主机名 (MYSQL_HOST),MySQL 用户名(MYSQL_USER),MySQL 密码(MYSQL_PASSWORD)和要备份的 MySQL 数据库名称(MYSQL_DATABASE)。此服务将备份存储到 /backup/backup.sql 文件中,它与本地目录 ./backup 映射。

'cron' 服务使用 alpine 映像,以 CRON 父进程 RUN crond 来解释由 'backup' 服务生成的备份计划。该服务使用本地目录 ./backup-cron 映射到 /etc/cron.d/backup-cron 来提供 cron job 安排。在 ./backup-cron 目录中,你可以创建一个名为 backup 的文件,它包含你想要定期执行的备份计划(例如:每天上午 2 点)。

要创建此文件,请运行以下命令:

echo "0 2 * * * root /usr/bin/mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE > /backup/backup.sql" > ./backup-cron/backup

请注意,如果您希望在本地计算机上安排 cron 作业,则需要确保 cron 客户端已安装并在运行。此外,该计划将在容器内运行,而不是主机上。如果您需要将备份保存到本地计算机,则需要使用卷(volumes)来挂载本地目录。