Как переместить контейнеры Docker между разными хостами?
Я не могу найти способ перемещения докеров, запускающих контейнеры, с одного хоста на другой.
Можно ли как-нибудь отправить свои контейнеры в репозитории, как мы делаем для изображений? В настоящее время я не использую тома данных для хранения данных, связанных с приложениями, работающими внутри контейнеров. Поэтому некоторые данные находятся внутри контейнеров, которые я хочу сохранить до изменения настроек.
Ответы
Ответ 1
Вы не можете переместить работающий докер-контейнер с одного хоста на другой.
Вы можете зафиксировать изменения в своем контейнере для изображения с помощью docker commit
, переместить изображение на новый хост и затем запустить новый контейнер с помощью docker run
. Это сохранит все данные, созданные вашим приложением внутри контейнера.
Nb: Он не сохраняет данные, которые хранятся внутри томов; вам нужно переместить тома данных вручную на новый хост.
Ответ 2
В качестве альтернативы, если вы не хотите отправлять в хранилище:
-
Экспортировать контейнер в тарболл
docker export <CONTAINER ID> > /home/export.tar
-
Переместите свой тарбол на новую машину
-
Импортировать обратно
cat /home/export.tar | docker import - some-name:latest
Ответ 3
В конце концов, после многих запутанных руководств и запутанных учебных пособий у меня сработало то, что Докер, очевидно, в момент моего написания на взгляде завышенных ожиданий, это:
- Сохраните изображение докера в архив:
docker save image_name > image_name.tar
- скопировать на другую машину
- на другом компьютере Docker запустите загрузку Docker следующим образом:
cat image_name.tar | docker load
Экспорт и импорт, как предлагается в других ответах, не экспортируют порты и переменные, которые могут потребоваться для работы вашего контейнера. И у вас могут возникнуть такие вещи, как "Команда не указана" и т.д.... при попытке загрузить ее на другой компьютер.
Таким образом, разница между сохранением и экспортом заключается в том, что команда сохранения сохраняет все изображение с историей и метаданными, а команда экспорта экспортирует только структуру файлов (без истории или метаданных).
Само собой разумеется, что, если у вас уже есть эти порты, занятые гипервизором докера, который вы выполняете импортом, через какой-то другой докер-контейнер, вы окажетесь в конфликте и вам придется перенастроить открытые порты.
Ответ 4
Из документации Docker:
docker export
не экспортирует содержимое связанных томов с контейнером. Если объем установлен поверх существующего каталог в контейнере, docker export
будет экспортировать содержимое основного каталога, а не содержимого тома. обращаться to Резервное копирование, восстановление или миграция данных объемыв руководстве пользователя для примеров по экспорту данных в томе.
Другие внешние инструменты:
Чтобы переместить контейнер со связанным с ним объемом данных, вы можете использовать Flocker https://clusterhq.com/flocker/introduction/
Ответ 5
Используйте этот скрипт: https://github.com/ricardobranco777/docker-volumes.sh
Это сохраняет данные в объемах.
Пример использования:
# Stop the container
docker stop $CONTAINER
# Create a new image
docker commit $CONTAINER $CONTAINER
# Save image
docker save -o $CONTAINER.tar $CONTAINER
# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar
# Copy image and volumes to another host
scp $CONTAINER.tar $CONTAINER-volumes.tar [email protected]$HOST:
# On the other host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER
# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar
# Start container
docker start $CONTAINER
Ответ 6
Я пробовал много решений для этого, и это то, что работает для меня:
1. сохранить/сохранить контейнер в новом изображении:
- ++ зафиксировать контейнер:
# остановка докера
# docker commit CONTAINER_NAME
# docker save --output IMAGE_NAME.tar IMAGE_NAME: TAG
ps: "Наш контейнер CONTAINER_NAME имеет смонтированный том в"/var/home "" (вы должны проверить свой контейнер, чтобы указать путь к нему: # docker inspect CONTAINER_NAME)
- ++ сохранить его объем: мы будем использовать образ Ubuntu, чтобы сделать это.
# Резервное копирование mkdir
# docker run --rm - -v в полях - от CONTAINER_NAME -v $ {pwd}/backup: /backup ubuntu bash -c "cd/var/home && tar cvf/backup/volume_backup.tar."
Теперь, когда вы посмотрите на $ {pwd}/backup, вы найдете наш том в формате tar.
До сих пор у нас есть изображение conatainer 'IMAGE_NAME.tar' и его том 'volume_backup.tar'.
Теперь вы можете воссоздать тот же старый контейнер на новом хосте.