Как описано в документации Docker по работе с томами, существует концепция так называемых контейнеров только для данных , которые предоставляют том, который может быть смонтирован в несколько других контейнеров, независимо от того, работает ли контейнер только для данных на самом деле или нет.
В общем, звучит потрясающе. Но одного я не понимаю.
Эти тома (которые явно не сопоставляются с папкой на хосте по причинам переносимости, как указано в документации) создаются и управляются Docker в некоторой внутренней папке на хосте ( /var/docker/volumes/…
).
Предположим, я использую такой том, а затем мне нужно перенести его с одного хоста на другой - как мне перенести том? AFAICS имеет уникальный идентификатор - могу ли я просто скопировать том и соответствующий контейнер только для данных на новый хост? Как узнать, какие файлы копировать? Или в Docker встроена поддержка, которую я еще не обнаружил?
docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz
это не зависит от деталей реализации томов. И импортируйте данные с tar на вторую машину.Ответы:
Официальный ответ доступен в разделе «Резервное копирование, восстановление или перенос томов данных» :
РЕЗЕРВНОЕ КОПИРОВАНИЕ:
--rm
: удалить контейнер, когда он выходит--volumes-from DATA
: прикрепить к томам, совместно используемым контейнером DATA-v $(pwd):/backup
: bind смонтировать текущий каталог в контейнер; записать tar-файл вbusybox
: небольшое более простое изображение - удобное для быстрого обслуживанияtar cvf /backup/backup.tar /data
: создает несжатый tar-файл всех файлов в каталоге / dataВОССТАНОВИТЬ:
источник
docker create
для контейнеров только с данными, чтобы они не запускались. Пример в офф. документация: docs.docker.com/userguide/dockervolumes/…/data
с/var/lib/postgresql/data
, правильно?docker exec
в него войти), тогда простая командаtail -f /dev/null
никогда не завершится, но использует минимальные ресурсы. Когда он вам больше не нужен, онdocker stop data-container
сделает это за вас. Объемы остаются для других контейнеров.Вы можете экспортировать том в tar и перенести на другую машину. И импортируйте данные с tar на вторую машину. Это не зависит от деталей реализации томов.
источник
docker run -v /data-volume -name datacointainer busybox true
- вы можете запустить его где угодно. После создания контейнера данных вы можете импортировать tar-архив, как описано в ответе.--cidfile=id.txt
качестве параметра запуска. Идентификатор контейнера будет сохранен в файлеid.txt
. Я обновил ответ.docker run --rm
вместоdocker run --cidfile ... ; docker rm
.Расширение официального ответа из документов Docker и главный ответ здесь , вы можете иметь следующие псевдонимы в своих .bashrc или .zshrc
Обратите внимание, что резервная копия сохраняется в
/tmp
, поэтому вы можете перемещать сохраненный файл резервной копии между хостами докеров.Также есть две пары псевдонимов резервного копирования / восстановления. Один использует сжатие и debian: jessie, а другой - без сжатия, но с busybox. Используйте сжатие, если файлы для резервного копирования большие.
источник
Я добавлю сюда еще один недавний инструмент от IBM, который на самом деле предназначен для переноса томов с одного контейнера на другой. Это текущий проект. Так что в будущем вы можете найти другую версию с дополнительными функциями.
Cargo был разработан для миграции контейнеров с одного хоста на другой вместе с их данными с минимальным временем простоя. Cargo использует возможности объединения данных файловой системы union для создания единого представления данных (в основном корневой файловой системы) на исходном и целевом хостах. Это позволяет Cargo запускать контейнер почти сразу (в течение миллисекунд) на целевом хосте, поскольку данные из исходной корневой файловой системы копируются на целевые хосты либо по требованию (с использованием раздела копирования при записи (COW) ), либо лениво. в фоновом режиме (с помощью rsync) .
Важные моменты: -
centralized
сервер обрабатывает процесс миграцииСсылка на проект здесь:
источник
Если ваши машины находятся в разных VPC или вы хотите скопировать с / на локальную машину (как в моем случае), вы можете использовать созданный мной dvsync . По сути, это ngrok в сочетании с
rsync
SSH, упакованный в два небольших (~ 25 МБ) образа. Сначала вы запускаетеdvsync-server
на машине, с которой хотите скопировать данные (вам понадобится та,NGROK_AUTHTOKEN
которую можно получить с панели инструментов ngrok ):Затем вы можете запустить
dvsync-client
на машине, на которую хотите скопировать файлы, передаваяDVSYNC_TOKEN
показанный сервером:Как только копирование будет выполнено, клиент выйдет. Это также работает с Docker CLI, Compose, Swarm и Kubernetes.
источник