Резервное копирование сервера, запустив rsync в Docker

задняя часть Docker

задний план

Резервное копирование сервера — одна из ежедневных задач, которые необходимо выполнять, а работа по резервному копированию — это трехмерный процесс, идеального плана не существует, план резервного копирования необходимо определять в соответствии с реальной ситуацией. Программа, которую я вам представил на этот раз, универсальна и больше подходит для резервного копирования небольших серверов, например персональных серверов.

Применимая сцена

  • Объем данных на сервере невелик, и частота обновления данных невысока.
  • Я надеюсь регулярно выполнять резервное копирование своего личного облачного сервера на локальный компьютер, такой как MacBook (это то, что я использую)
  • Некоторые небольшие сервисы, используемые внутри компании для резервного копирования.

идеи

rsyncЭто очень эффективный инструмент синхронизации файлов, который может выполнять удаленную дифференциальную синхронизацию большого количества файлов.rsyncФункции, дифференциальная синхронизация и возобновляемая передача в точках останова делают процесс синхронизации файлов очень эффективным. и он используетsshВ качестве канала передачи, независимо от того, в какой сети вы находитесь, резервная передача может осуществляться очень безопасно.

Обычно мы используемrsyncпуть черезcronНастройте временные задачи, чтобы вызватьrsyncСделайте резервную копию. Но этот подход будет иметь некоторые проблемы в реальном использовании:

  • Необходимо редактировать и настраивать указанный файл, что неудобно для схемы копирования
  • Требует дополнительной установкиrsyncа такжеcron, для обычногоdockerДля людей, которые этого не делают, «установка программного обеспечения» просто слишком большая проблема!
  • Когда интервал резервного копирования слишком короткий, если последнее резервное копирование не было завершено, одновременно будут запущены два процесса резервного копирования.В прошлом по этой причине сервер резервного копирования зависал, но у автора также есть решение к этой проблеме, и я расскажу о ней в следующий раз.

Можно ли все запустить в докере,docker-compose.yml, линияdocker-compose up, ты сможешьJust work

план

Сохраните следующее какdocker-compose.yml, войдите в этот каталог файлов и запуститеdocker-compos up

version: "3"

services:
  rsync:
    image: instrumentisto/rsync-ssh
    restart: always
    container_name: rsync
    volumes:
      - ${HOME}/.ssh:/root/.ssh
      - ${PWD}/backup:/backup
    entrypoint:
      - /bin/sh
      - -c
      - |
        # 输出包含当前时间的日志
        function log() {
          echo -e "`date -d @?((\`date +%s\`+3600*8)) '+%Y-%m-%d %H:%M:%S'` ?@"
        }

        # 备份服务器,用法:
        # backup <备份名> <服务器地址> [备份目录默认/docker/.]
        function backup() {
          log "============================"
          log "开始备份: ?1"
          rsync -az --timeout=3600 -P --partial --delete -e ssh root@?2:?{3:-/docker/.} /backup/?2.backup
          log "结束备份: ?1"
        }

        # 开始备份任务
        while true
        do
        	
          # 根据实际情况类推,添加服务器
          backup "Gitlab服务器" "192.168.2.2" /root/.
          backup "ineva.cn服务器" "ineva.cn"

          # 休眠5分钟
          log "休眠5分钟"
          sleep 300
        done

Проблемы, возникающие при докеризации

  • Чрезвычайно легкое зеркальное отображение, предпочтительно основанное наalpine

Наконец нашел зеркало идеального соответствияinstrumentisto/rsync-ssh, Только4Mразмер, есть все необходимые функции

  • rsyncиспользуетsshДля подключения нужно указать приватный ключ

Трюк для решения этой проблемы, сначала настройте备份载体服务器Aможно подключить к需要备份的主机B, то.sshкаталог сопоставляется сcontainerПреимущество этого в том, что вам нужно только убедиться, что A может подключиться к B, и контейнер также получит те же разрешения.

  • Как запускать несколько скриптов, не добавляя лишних файлов, и писать на отдельных строках

Я пробовал несколько решений раньше, и может выполнять несколько скриптов, но все они должны быть написаны в одну строку.Если скриптов слишком много, неудобно поддерживать и читать, и, наконец, нашел решение:GitHub.com/docker-case пациент…, единственное, на что нужно обратить внимание, так это на то, что в скрипте$БудетyamlСинтаксисом считается префикс имени переменной окружения, который необходимо экранировать и изменить на?Просто

  • Время вывода журнала находится в часовом поясе 0, Китай находится в зоне +08:00, время вывода нелегко прочитать

По этой причине автор специально написал статью для ознакомления с решением этой проблемы.Заинтересованные друзья могут глянуть:

Способ изменения часового пояса в Docker, особенно в alpine

Оптимизация скрипта

Список серверов резервного копирования изменяется непосредственно в сценарии, что немного грязно. Если вы хотите улучшить его, поместите список резервных копий в переменную среды.Сценарий определяет цель резервного копирования, читая значение в переменной среды, поэтому сценарий красивее! Автор не будет делать этот шаг и предоставит каждому возможность поиграть.