Як перенести томи, що містять лише дані, з одного хоста на інший?


121

Як описано в документації Докера про Роботу з томами, існує концепція так званих контейнерів, що містять дані , які забезпечують об'єм, який можна встановити в декілька інших контейнерів, незалежно від того, реально працює контейнер, призначений лише для даних.

В основному це звучить приголомшливо. Але є одне, чого я не розумію.

Ці томи (які явно не відображають у папку на хості з міркувань переносимості, як зазначено в документації) створюються та управляються Docker у якійсь внутрішній папці хоста ( /var/docker/volumes/…).

Припустимо, я використовую такий об'єм, а потім мені потрібно перенести його з одного хоста на інший - як же я перенести том? AFAICS має унікальний ідентифікатор - чи можу я просто перейти та скопіювати об'єм та його контейнер, призначений лише для даних, на новий хост? Як дізнатися, які файли скопіювати? Або є якась підтримка, вбудована в Docker, яку я ще не виявив?


12
Ви можете експортувати каталог контейнерів даних: docker run --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgzЦе не покладається на деталі реалізації томів. І імпортуйте дані з дьогтем на другу машину.
Іржі

1
Ого, це приголомшливо, дякую :-)))! Якщо ви напишете цей коментар як відповідь, я з радістю прийму його!
Голо Роден

Відповіді:


136

Офіційна відповідь доступна в розділі "Резервне копіювання, відновлення або переміщення томів даних" :

НАЗАД:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: вийміть контейнер під час його виходу
  • --volumes-from DATA: приєднати до томів, спільним для контейнера DATA
  • -v $(pwd):/backup: прив’язати кріплення поточного каталогу до контейнера; написати файл tar на
  • busybox: невелике простіше зображення - добре для швидкого обслуговування
  • tar cvf /backup/backup.tar /data: створює нестиснений файл tar для всіх файлів у каталозі / data

ВІДНОВЛЕННЯ:

# create a new data container
$ sudo docker create -v /data --name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

3
Наразі краще використовувати docker createконтейнери лише для даних, щоб вони не були запущені. Див. Приклад у вимкненому стані. документація: docs.docker.com/userguide/dockervolumes/…
FelikZ

1
Отже ... Якщо я намагаюся зробити резервну копію бази даних Postgres, що б я замінити /dataз /var/lib/postgresql/data, правильно?
425nesp

6
Розділ "Резервне копіювання, відновлення чи переміщення томів даних", здається, видалено з документації Docker :-(
SteveC

2
@Datz - це просто команда, яка викликається створення контейнера даних, це може бути будь-яка команда, яка насправді нічого не робить. Контейнер запускається і негайно виходить, але він використовується для збереження даних.
tommasop

1
@rszalski Якщо з якихось причин вам потрібен контейнер, щоб він продовжував працювати (скажімо, ви хочете docker execв нього), то проста команда, tail -f /dev/nullяка ніколи не вийде, але використовує мінімальні ресурси. Коли вам це більше не потрібно, він docker stop data-containerзробить це за вас. Обсяги залишаються для інших контейнерів.
Джессі Чизгольм

16

Ви можете експортувати об'єм в тар і перенести на інший апарат. І імпортуйте дані з дьогтем на другу машину. Це не покладається на деталі реалізації обсягів.

# you can list shared directories of the data container
docker inspect <data container> | grep "/vfs/dir/"

# you can export data container directory to tgz
docker run --cidfile=id.tmp --volumes-from <data container> ubuntu tar -cO <volume path> | gzip -c > volume.tgz

# clean up: remove exited container used for export and temporary file
docker rm `cat id.tmp` && rm -f id.tmp

Дякую за вашу відповідь. Як я можу перемістити контейнер даних з одного хоста на інший?
Дзунг Нгуен

1
@nXqd Контейнер даних створений компанією docker run -v /data-volume -name datacointainer busybox true- це можна запустити будь-де. Після створення контейнера даних ви можете імпортувати архів дьогтю, як пояснено у відповіді.
Іржі

Дякую за вашу відповідь. Але я зіткнувся з іншою проблемою, що нам потрібно видалити контейнер для зомбі, який використовується для резервного копіювання згодом. Оскільки це не повертає ідентифікатор. Чи є у вас хороший спосіб: D
Dzung Nguyen

@nXqd Звичайно - ви повинні використовувати --cidfile=id.txtяк параметр запуску. Ідентифікатор контейнера буде зберігатися у файлі id.txt. Я оновив відповідь.
Іррі

9
Ви можете просто використовувати docker run --rmзамість цього docker run --cidfile ... ; docker rm.
Фелікс Рабе

16

Розширивши офіційну відповідь від Docker Docs та верхню відповідь тут , ви можете мати псевдоніми у своїх .bashrc або .zshrc

# backup files from a docker volume into /tmp/backup.tar.gz
function docker-volume-backup-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -czvf /backup/backup.tar.gz "${@:2}"
}
# restore files from /tmp/backup.tar.gz into a docker volume
function docker-volume-restore-compressed() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie tar -xzvf /backup/backup.tar.gz "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" debian:jessie ls -lh "${@:2}"
}
# backup files from a docker volume into /tmp/backup.tar
function docker-volume-backup() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -cvf /backup/backup.tar "${@:2}"
}
# restore files from /tmp/backup.tar into a docker volume
function docker-volume-restore() {
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox tar -xvf /backup/backup.tar "${@:2}"
  echo "Double checking files..."
  docker run --rm -v /tmp:/backup --volumes-from "$1" busybox ls -lh "${@:2}"
}

Зверніть увагу, що резервна копія збережена /tmp, і ви можете перемістити збережений там файл резервного копіювання між хостами докера.

Також є дві пари псевдонімів резервного копіювання / відновлення. Один, що використовує компресію та debian: jessie та інший без стиснення, але зайнятий. Вигідно використовувати стиснення, якщо файли для резервного копіювання великі.


3

Я додам сюди ще один останній інструмент від IBM, який фактично створений для міграції обсягу з одного хоста контейнера в інший. Це зараз триваючий проект. Отже, ви можете в майбутньому знайти іншу версію з додатковими функціями.

Вантаж був розроблений для міграції контейнерів з одного хоста на інший, а також їх даних з мінімальним простоєм. Cargo використовує можливості об'єднання даних файлової системи об'єднання для створення єдиного представлення даних (головним чином, кореневої файлової системи) через вихідний та цільовий хости. Це дозволяє Карго майже негайно (протягом мілісекунд) запустити контейнер на цільовому хості, оскільки дані з вихідної кореневої файлової системи копіюються в цільові хости або на вимогу (використовуючи розділ копіювання на запис (COW) ), або ліниво у фоновому режимі (за допомогою rsync) .

Важливі моменти: - centralizedсервер обробляє процес міграції

Посилання на проект наведено тут:

https://github.com/nadgowdas/cargo

3

Якщо ваші машини знаходяться в різних VPC або ви хочете скопіювати з / на локальну машину (як у моєму випадку), ви можете використовувати створений мною dvsync . Це в основному ngrok у поєднанні із rsyncSSH, упакованим у два невеликих (обидва ~ 25 МБ) зображення. По-перше, ви запускаєте dvsync-serverна машині, з якої потрібно скопіювати дані (вам знадобиться те, NGROK_AUTHTOKENщо можна отримати на інформаційній панелі ngrok ):

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=MY_VOLUME,target=/data,readonly \
  quay.io/suda/dvsync-server

Потім ви можете запустити dvsync-clientна машині, на яку потрібно скопіювати файли, передаючи DVSYNC_TOKENпоказане сервером:

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client 

Як тільки копіювання буде виконано, клієнт вийде. Це також працює з Docker CLI, Compose, Swarm та Kubernetes.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.