Подтвердить что ты не робот

Как я могу создать резервную копию контейнера Docker с его объемами данных?

Я использовал этот Docker-образ tutum/wordpress, чтобы продемонстрировать сайт Wordpress. Недавно я узнал, что образ использует тома для MySQL-данных.

Итак, проблема заключается в следующем: если я хочу создать резервную копию и восстановить контейнер, я могу попытаться зафиксировать изображение, а затем удалить контейнер и создать новый контейнер из зафиксированного изображения. Но если я это сделаю, то том удаляется, и все мои данные уходят.

Должен быть какой-то простой способ резервного копирования моего контейнера и его объемных данных, но я не могу его найти нигде.

4b9b3361

Ответ 1

если я хочу вернуть контейнер, я могу попытаться зафиксировать изображение, а затем удалить контейнер и создать новый контейнер из зафиксированного изображения. Но если я сделаю это, том будет удален и все мои данные исчезнут

Как объясняется в руководстве пользователя докера, тома данных предназначены для сохранения данных вне файловой системы контейнера. Это также облегчает обмен данными между несколькими контейнерами.

Хотя Docker никогда не удалит данные в томах (если только вы не удалите связанный контейнер с помощью docker rm -v), тома, на которые не ссылается ни один контейнер docker rm -v, называются висячими томами. От этих свисающих томов трудно избавиться и труднее получить доступ.

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

Чтобы предотвратить эти висячие тома, нужно создать дополнительный докер-контейнер, используя том данных, который вы хотите сохранить; так что всегда будет хотя бы тот докер контейнер, ссылающийся на том. Таким образом, вы можете удалить Docker-контейнер, на котором запущено приложение WordPress, без потери легкости доступа к содержимому тома данных.

Такие контейнеры называются контейнерами с объемом данных.

Должен быть какой-то простой способ сделать резервную копию моего контейнера плюс объемные данные, но я нигде не могу его найти.

резервное копирование образов докера

Для резервного копирования образов Docker используйте команду docker save, которая создаст архив tar, который можно будет использовать позже для создания нового образа docker с помощью команды загрузки docker.

резервные док-контейнеры

Вы можете создать резервную копию контейнера Docker различными способами

  • путем фиксации нового образа докера на основе текущего состояния контейнера докера с помощью команды фиксации докера
  • экспортируя файловую систему контейнера docker в виде архива tar с помощью команды экспорта docker. Позже вы сможете создать новый образ Docker из этого архива tar с помощью команды импорта Docker.

Имейте в виду, что эти команды будут только создавать резервные копии файловой системы многоуровневого контейнера Docker. Это исключает объемы данных.

тома данных резервного копирования

Для резервного копирования тома данных вы можете запустить новый контейнер, используя том, который вы хотите сделать резервную копию, и выполнив команду tar, чтобы создать архив содержимого тома, как описано в руководстве пользователя докера.

В вашем конкретном случае объем данных используется для хранения данных для сервера MySQL. Поэтому, если вы хотите экспортировать архив tar для этого тома, вам сначала нужно остановить сервер MySQL. Для этого вам придется остановить контейнер WordPress.

резервное копирование данных MySQL

Другим способом является удаленное подключение к серверу MySQL для создания дампа базы данных с помощью команды mysqldump. Однако, чтобы это работало, ваш сервер MySQL должен быть настроен на прием удаленных подключений, а также иметь пользователя, которому разрешено удаленное подключение. Это может быть не так с изображением Docker WordPress, которое вы используете.


редактировать

Docker недавно представил плагины томов Docker, которые позволяют делегировать обработку томов плагинам, реализованным производителями.

Команда docker run имеет новое поведение для опции -v. Теперь можно передать ему имя тома. Созданные таким образом тома названы и на них легче ссылаться позже, что облегчает проблемы с висячими томами.

Редактировать 2

Docker ввел команду docker volume prune чтобы легко удалить все висячие тома.

Ответ 2

ОБНОВЛЕНИЕ 2

Необработанный сценарий резервного копирования одного тома:

#!/bin/bash
# This script allows you to backup a single volume from a container
# Data in given volume is saved in the current directory in a tar archive.
CONTAINER_NAME=$1
VOLUME_NAME=$2

usage() {
  echo "Usage: $0 [container name] [volume name]"
  exit 1
}

if [ -z $CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

if [ -z $VOLUME_NAME ]
then
  echo "Error: missing volume name parameter."
  usage
fi

sudo docker run -rm --volumes-from $CONTAINER_NAME -v $(pwd):/backup busybox tar cvf /backup/backup.tar $VOLUME_NAME

Скрипт восстановления исходного тома:

#!/bin/bash
# This script allows you to restore a single volume from a container
# Data in restored in volume with same backupped path
NEW_CONTAINER_NAME=$1

usage() {
  echo "Usage: $0 [container name]"
  exit 1
}

if [ -z $NEW_CONTAINER_NAME ]
then
  echo "Error: missing container name parameter."
  usage
fi

sudo docker run -rm --volumes-from $NEW_CONTAINER_NAME -v $(pwd):/backup busybox tar xvf /backup/backup.tar

Использование может быть таким:

$ volume_backup.sh old_container /srv/www
$ sudo docker stop old_container && sudo docker rm old_container
$ sudo docker run -d --name new_container myrepo/new_container
$ volume_restore.sh new_container

Предположения таковы: файл резервной копии называется backup.tar, он находится в том же каталоге, что и сценарий резервного копирования и восстановления, имя тома в контейнерах одинаковое.

ОБНОВИТЬ

Мне кажется, что резервное копирование томов из контейнеров не отличается от резервного копирования томов из контейнеров данных.

Тома - это не что иное, как пути, связанные с контейнером, поэтому процесс такой же.

Я не знаю, работает ли docker-backup и для тех же контейнеров, но вы можете использовать:

sudo docker run -rm --volumes-from yourcontainer -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

а также:

sudo docker run -rm --volumes-from yournewcontainer -v $(pwd):/backup busybox tar xvf /backup/backup.tar

КОНЕЦ ОБНОВЛЕНИЯ

Доступен этот замечательный инструмент, который позволяет создавать резервные копии и восстанавливать контейнеры томов Docker:

https://github.com/discordianfish/docker-backup

если у вас есть контейнер, связанный с некоторыми объемами контейнеров, как это:

$ docker run --volumes-from=my-data-container --name my-server ...

Вы можете сделать резервную копию всех томов, как это:

$ docker-backup store my-server-backup.tar my-server

и восстановить так:

$ docker-backup restore my-server-backup.tar

Или вы можете следовать официальным путем:

Как перенести тома только для данных с одного хоста на другой?

Ответ 3

Если вам нужна только резервная копия смонтированных томов, вы можете просто скопировать папки с вашего Dockerhost.

Примечание. Если вы находитесь в Ubuntu, Dockerhost - это ваша локальная машина. Если вы находитесь на Mac, Dockerhost - это ваша виртуальная машина.

В Ubuntu

Здесь вы можете найти все папки с томами: /var/lib/docker/volumes/, чтобы вы могли скопировать их и архивировать там, где хотите.

В MAC

Это не так просто, как на Ubuntu. Вам нужно скопировать файлы с виртуальной машины.

Вот script, как скопировать все папки с томами с виртуальной машины (где работает сервер Docker) на ваш локальный компьютер. Предположим, что ваша виртуальная машина-докер-машина с именем по умолчанию.

docker-machine ssh default sudo cp -v -R /var/lib/docker/volumes/ /home/docker/volumes

docker-machine ssh default sudo chmod -R 777 /home/docker/volumes

docker-machine scp -R default:/home/docker/volumes ./backup_volumes

docker-machine ssh default sudo rm -r /home/docker/volumes

Он собирается создать папку ./backup_volumes в вашем текущем каталоге и скопировать все тома в эту папку.

Вот script того, как скопировать все сохраненные тома из вашего локального каталога (./backup_volumes) на машину Dockerhost

docker-machine scp -r ./backup_volumes default:/home/docker

docker-machine ssh default sudo mv -f /home/docker/backup_volumes /home/docker/volumes

docker-machine ssh default sudo chmod -R 777 /home/docker/volumes

docker-machine ssh default sudo cp -v -R /home/docker/volumes /var/lib/docker/

docker-machine ssh default sudo rm -r /home/docker/volumes

Теперь вы можете проверить, работает ли это:

docker volume ls

Ответ 4

Допустим, ваше имя тома является data_volume. Вы можете использовать следующие команды для резервного копирования и восстановления тома в образ докера с именем data_image:

Для резервного копирования:

docker run --rm --mount source=data_volume,destination=/data alpine tar -c -f- data | docker run -i --name data_container alpine tar -x -f-
docker container commit data_container data_image
docker rm data_container

Восстановить:

docker run --rm data_image tar -c -f- data | docker run -i --rm --mount source=data_volume,destination=/data alpine tar -x -f-

Ответ 5

Я знаю, что это старая версия, но я понимаю, что не существует хорошо документированного решения для передачи контейнера данных (в качестве резервной копии) в концентратор докеров. Я только что опубликовал короткий пример того, как это сделать, по адресу https://dzone.com/articles/docker-backup-your-data-volumes-to-docker-hub.

Ниже приводится нижняя строка

В руководстве по докеру вы можете сделать резервную копию и восстановить том данных локально. Мы собираемся использовать эту технику, добавив еще несколько строк, чтобы эта резервная копия была перенесена в докер-концентратор для простого восстановления в будущем в любом месте, которое мы хотим. Итак, начнем. Вот следующие шаги:

Резервное копирование тома данных из контейнера данных с именем data-container-to-backup

docker run --rm --volumes-from data-container-backup --name tmp-backup -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /folderToBackup

Разверните этот файл tar в новый контейнер, чтобы мы могли зафиксировать его как часть его образа

docker run -d -v $(pwd):/backup --name data-backup ubuntu /bin/sh -c "cd / && tar xvf /backup/backup.tar"

Зафиксируйте и нажмите на изображение с нужным тегом ($ VERSION)

docker commit data-backup repo/data-backup:$VERSION
docker push repo/data-backup:$VERSION

Наконец, давайте уберемся

docker rm data-backup
docker rmi $(docker images -f "dangling=true" -q)

Теперь в нашем репозитории есть образ с именем data-backup, который представляет собой просто файловую систему с файлами и папками резервных копий. Чтобы использовать этот образ (он же восстановить из резервной копии), мы делаем следующее:

Запустите контейнер данных с образом резервной копии данных

run -v /folderToBackup --entrypoint "bin/sh" --name data-container repo/data-backup:${VERSION}

Запустите ваш образ whatEver с томами из конрайтера данных

docker run --volumes-from=data-container repo/whatEver

Это оно.

Я был удивлен, что нет документации для этой работы. Я надеюсь, что кто-то найдет это полезным. Я знаю, что мне понадобилось время, чтобы подумать об этом.

Ответ 6

Следующая команда запускает tar в контейнере с установленными всеми указанными томами данных и перенаправляет вывод в файл:

docker run --rm `docker volume list -q | egrep -v '^.{64}$' | awk '{print "-v " $1 ":/mnt/" $1}'` alpine tar -C /mnt -cj . > data-volumes.tar.bz2

Обязательно проверьте полученный архив в случае, если что-то пошло не так:

tar -tjf data-volumes.tar.bz2

Ответ 7

Если вам просто нужна простая резервная копия в архив, вы можете попробовать мою маленькую утилиту: https://github.com/loomchild/volume-backup

пример

Резервное копирование:

docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup backup archive1

some_volume том с именем some_volume в /tmp/archive1.tar.bz2 архив

Восстановить:

docker run -v some_volume:/volume -v /tmp:/backup --rm loomchild/volume-backup restore archive1

сотрет и восстановление объема по имени some_volume из /tmp/archive1.tar.bz2 архивного файла.

Дополнительная информация: https://medium.com/@loomchild/backup-restore-docker-named-volumes-350397b8e362

Ответ 8

Я создал инструмент для организации и запуска резервного копирования данных и контейнеров mysql, просто называемых docker-backup. Существует даже готовое к использованию изображение на докере-концентраторе.

В основном это написано в Bash, поскольку это в основном оркестровка. Он использует duplicity для реального механизма резервного копирования. Вы можете в настоящее время выполнять резервное копирование на FTP (S) и Amazon S3.

Конфигурация довольно проста: напишите файл конфигурации в YAML, описывая, что делать с резервным копированием и где, и здесь вы идете!

Для контейнеров данных он автоматически монтирует тома, общие для вашего контейнера, для резервного копирования и обработки. Для контейнеров mysql он связывает их и запускает mysqldump в комплекте с вашим контейнером и обрабатывает результат.

Я написал его, потому что я использую Docker-Cloud, который не обновляется с недавними версиями докеров-двигателей, и потому, что я хотел использовать способ Docker, не включая какой-либо процесс резервного копирования внутри контейнеров приложений.

Ответ 9

Если ваш проект использует docker-compose, вот подход для резервного копирования и восстановления ваших томов.

докер-compose.yml

По сути, вы добавляете службы db-backup и db-restore в файл docker-compose.yml и адаптируете его под имя своего тома. Мой том называется dbdata в этом примере.

version: "3"

services:
  db:
    image: percona:5.7
    volumes:
      - dbdata:/var/lib/mysql

  db-backup:
    image: alpine    
    tty: false
    environment:
      - TARGET=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "tar -cjf /backup/$${TARGET}.tar.bz2 -C /volume ./"

  db-restore:
    image: alpine    
    environment:
      - SOURCE=dbdata
    volumes:
      - ./backup:/backup
      - dbdata:/volume
    command: sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/$${SOURCE}.tar.bz2"

Избегайте коррупции

Для обеспечения согласованности данных остановите контейнер базы данных перед резервным копированием или восстановлением.

docker-compose stop db

Резервное копирование

Резервное копирование в место назначения по умолчанию (backup/dbdata.tar.bz2):

docker-compose run --rm db-backup

Или, если вы хотите указать альтернативное имя цели, выполните:

docker-compose run --rm -e TARGET=mybackup db-backup

Восстановление

Чтобы восстановить из backup/dbdata.tar.bz2, выполните:

docker-compose run --rm db-restore

Или восстановить из определенного файла, используя:

docker-compose run --rm -e SOURCE=mybackup db-restore

Я адаптировал команды из https://loomchild.net/2017/03/26/backup-restore-docker-named-volumes/ для создания этого подхода.

Ответ 10

Если вам нравится вводить тайные операторы из командной строки, вам понравятся эти методы резервного копирования вручную. Имейте в виду, что более быстрый и эффективный способ резервного копирования контейнеров также эффективен. Я написал инструкции здесь: https://www.morpheusdata.com/blog/2017-03-02-how-to-create-a-docker-backup-with-morpheus

Шаг 1: добавьте хост докера в любое облако Как поясняется в учебном пособии по сайту поддержки Morpheus, вы можете добавить хост Docker в облако по вашему выбору в считанные секунды. Начните с выбора инфраструктуры на главной навигационной панели Morpheus. Выберите "Хосты" в верхней части окна "Инфраструктура" и нажмите кнопку "+ Контейнерные хосты" в правом верхнем углу.

Чтобы создать резервную копию узла Docker в облаке через Morpheus, перейдите на экран Infrastructure и откройте меню "+ Container Hosts".

Выберите тип хоста контейнера в меню, выберите группу и введите данные в пять полей: имя, описание, видимость, выберите облако и введите теги (необязательно). Нажмите "Далее", а затем настройте параметры хоста, выбрав план обслуживания. Обратите внимание: поля Volume, Memory и CPU count будут видны только в том случае, если выбранный вами план активирован.

Здесь вы добавляете и изменяете тома, задаете размер памяти и количество процессоров и выбираете сеть. Вы также можете настроить имя пользователя и пароль ОС, имя домена и имя хоста, которое по умолчанию является именем контейнера, которое вы ввели ранее. Нажмите "Далее", а затем добавьте все рабочие процессы автоматизации (необязательно). Наконец, просмотрите свои настройки и нажмите "Завершить", чтобы сохранить их.

Шаг 2: добавьте интеграцию реестра Docker в открытые или закрытые облака Adam Hicks описывает в другом учебнике Morpheus, как легко интегрироваться с частным реестром Docker. (Никакая дополнительная конфигурация не требуется для использования Morpheus для предоставления изображений в общедоступном концентраторе Dockers с использованием общедоступного API Docker.)

Выберите "Интеграции" на вкладке "Администратор" главной панели навигации, а затем нажмите кнопку "+ Новая интеграция" в правой части экрана. В появившемся окне интеграции выберите Docker Repository в раскрывающемся меню "Тип", введите имя и добавьте конечную точку API закрытого реестра. Укажите имя пользователя и пароль для используемого реестра, и нажмите кнопку "Сохранить изменения".

Интегрируйте Docker Registry с частным облаком через диалоговое окно "Новая интеграция" Morpheus.

Чтобы обеспечить только что созданную интеграцию, выберите "Докер" в "Тип" в диалоговом окне "Создать экземпляр", выберите реестр в раскрывающемся меню "Реестр докеров" на вкладке "Конфигурация", а затем продолжите подготовку, как и любой контейнер Docker.

Шаг 3: Управление резервными копиями После того, как вы добавили хост Docker и интегрировали реестр, резервная копия будет настроена и выполнена автоматически для каждого предоставленного вами экземпляра. Поддержка Morpheus предоставляет инструкции для просмотра резервных копий, создания резервной копии экземпляра и создания резервной копии сервера.

Ответ 11

Если у вас есть так просто, как у меня, вы можете сделать следующее:

  • Создайте файл Docker, который расширяет базовое изображение вашего контейнера.
  • Я предполагаю, что ваши тома сопоставлены с вашей файловой системой, поэтому вы можете просто добавить эти файлы/папки к своему изображению, используя ADD folder destination
  • Готово!

Например, если у вас есть данные из томов в вашем домашнем каталоге, например, в /home/mydata, вы можете запустить следующее:

DOCKERFILE=/home/dockerfile.bk-myimage
docker build --rm --no-cache -t $IMAGENAME:$TAG -f $DOCKERFILE /home/pirate

Если ваш DOCKERFILE указывает на такой файл:

FROM user/myimage
MAINTAINER Danielo Rodríguez Rivero <[email protected]>

WORKDIR /opt/data
ADD mydata .

Остальная часть материала наследуется от базового изображения. Теперь вы можете нажать это изображение на облако докеров, и ваши пользователи будут иметь данные, доступные непосредственно в своих контейнерах.

Ответ 12

Если вы хотите выполнить полное резервное копирование, вам необходимо выполнить несколько шагов:

  1. Зафиксируйте контейнер для изображения
  2. Сохранить изображение
  3. Сделайте резервную копию тома контейнера, создав файл tar точки монтирования тома в контейнере.
  4. Повторите шаги 1-3 для контейнера базы данных.

Обратите внимание, что выполнение Docker-фиксации контейнера для изображения НЕ включает тома, прикрепленные к контейнеру (см. Документацию Docker-фиксации).

"Операция фиксации не будет включать никаких данных, содержащихся в томах, смонтированных внутри контейнера".