Как перемещать контейнеры Docker между разными хостами?

Я не могу найти способ перемещения контейнеров, работающих в докере, с одного хоста на другой.

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


person Dinesh Reddy    schedule 26.02.2015    source источник
comment
Взгляните на flocker github.com/ClusterHQ/flocker.   -  person Adrian Mouat    schedule 26.02.2015
comment
Обратите внимание, что вы можете использовать сохранение/загрузку вместо экспорта/импорта, так как при сохранении сохраняются метаданные и история.   -  person Burstaholic    schedule 24.06.2015
comment
Должно ли это быть комментарием к ответу @aholt?   -  person Martin Thompson    schedule 19.07.2015
comment
docker save предназначен для сохранения изображений, а не контейнеров. docs.docker.com/engine/reference/commandline/save   -  person stmllr    schedule 09.06.2016


Ответы (7)


Вы не можете переместить работающий контейнер Docker с одного хоста на другой.

Вы можете зафиксировать изменения в своем контейнере в образе с помощью docker commit, переместите image на новый хост, а затем запустите новый контейнер с помощью docker run. Это сохранит любые данные, созданные вашим приложением внутри контейнера.

Примечание: данные, хранящиеся внутри томов, не сохраняются; вам нужно вручную переместить тома данных на новый хост.

person larsks    schedule 26.02.2015
comment
@larsks Не будет ли первым шагом остановить контейнер, а затем выполнить фиксацию? - person valentt; 06.09.2016
comment
@valentt Возможно и то, и другое: зафиксировать работающий и остановленный контейнер. - person crollywood; 10.11.2016
comment
Этот ответ на самом деле не объясняет точно команды, которые вам нужно использовать, что затрудняет работу такого нуба, как я. - person Paul Kruger; 20.08.2019
comment
docker-checkpoint может позволить вам перемещать работающий контейнер между хостами, если они оба поддерживают CRIU. - person dGRAMOP; 31.05.2020
comment
1. остановить контейнер docker stop x; 2. зафиксировать ваши изменения docker commit -p x x; 3. сохранить контейнер в образ docker save -o x x; 4. переместите файл x на новый хост и на новом хосте загрузите новый образ dokcer load -i x (если вы запустили контейнер с опцией -v, вам также придется переместить эти файлы на новый хост); 5. запустите этот образ с помощью docker run (-v is required to mount these files if needed) - person Lau Real; 04.06.2020

В качестве альтернативы, если вы не хотите отправлять в репозиторий:

  1. Экспорт контейнера в архив

    docker export <CONTAINER ID> > /home/export.tar
    
  2. Переместите архив на новую машину

  3. Импортировать обратно

    cat /home/export.tar | docker import - some-name:latest
    
person aholt    schedule 26.02.2015
comment
Также не сохраняет данные, хранящиеся внутри томов. - person stmllr; 09.06.2016
comment
Как это должно работать? После импорта я получаю новый образ, и что дальше? Просто выполнить новую команду запуска? - person valentt; 03.09.2016
comment
На самом деле это очень плохое предложение, особенно для контейнеров с базой данных. Я попробовал это предложение, и оно не сработало. Может ли это работать с остановкой контейнера в первую очередь? - person valentt; 06.09.2016
comment
Это предложение было действительно предназначено только для альтернативы. Это может подойти для вашей ситуации, а может и нет. Что касается меня, то в то время я настраивал контейнеры Docker для репликации базы данных, а для экспорта/импорта не заботился о сохранении данных, так как регулярно выполнял резервное копирование данных базы данных в другой архив. Для этого это сработало отлично. - person aholt; 06.09.2016

Что в конечном итоге сработало для меня после множества запутанных руководств и запутанных руководств, поскольку Docker, очевидно, на момент написания моего письма находится по адресу взгляд на завышенные ожидания, это:

  1. Сохраните образ docker в архив:
    docker save image_name > image_name.tar
  2. скопировать на другую машину
  3. на другой машине docker запустите загрузку docker следующим образом:
    cat image_name.tar | docker load

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

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

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

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

person Aleksandar Pavić    schedule 11.05.2018
comment
Очень полезно. Сообщение «Команда не указана» сводило меня с ума. - person Rintoul; 25.07.2018
comment
Сообщение «Команда не указана» тоже сводило меня с ума. Я использую docker commit ‹container-id› stackstorm-local:2.9 и docker pull stackstorm-local:2.9 с другого хоста. - person Hua Zhang; 24.04.2019

Из документации докера:

docker export не экспортирует содержимое томов, связанных с контейнером. Если том монтируется поверх существующего каталога в контейнере, docker export экспортирует содержимое основного каталога, а не содержимое тома. См. раздел Резервное копирование, восстановление или перенос данных. тома в руководстве пользователя для примеров по экспорту данных в томе.

person Antonio De Marinis    schedule 08.08.2015
comment
Завершение работы штаб-квартиры кластера... и, кстати, для переноса контейнера, контейнер должен работать на ZFS/любой поддерживаемой лунке хранилища - person asvignesh; 11.01.2017

Используйте этот скрипт: 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 $USER@$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
person Ricardo Branco    schedule 30.10.2018
comment
У меня не работало на AWS Linux (Centos). В конце концов, я применил низкотехнологичный подход, используя docker inspect, чтобы найти каталог тома, а затем вручную скопировав его. - person JasonPlutext; 13.02.2019
comment
@JasonPlutext Может быть, что-то связанное с SELinux? У вас включен SELinux? - person Ricardo Branco; 22.03.2019
comment
Получил это: tar: удаление ведущего `/' из имен членов - person hjahan; 05.09.2020
comment
@hjahan Это типичное сообщение tar. Не ошибка и даже не предупреждение. - person Ricardo Branco; 11.09.2020

Я пробовал много решений для этого, и это то, что сработало для меня:

1. зафиксируйте/сохраните контейнер в новом образе:

  1. ++ зафиксируйте контейнер:
    # docker stop
    # docker commit CONTAINER_NAME
    # docker save --output IMAGE_NAME.tar IMAGE_NAME:TAG


ps: "Наш контейнер CONTAINER_NAME имеет смонтированный том в '/var/home'" (вы должны проверить свой контейнер, чтобы указать путь к его тому: # docker inspect CONTAINER_NAME)

  1. ++ сохраните его том: для этого мы будем использовать образ Ubuntu.
    # mkdir backup
    # docker run --rm --volumes-from CONTAINER_NAME -v ${pwd}/ backup:/backup ubuntu bash -c «cd /var/home && tar cvf /backup/volume_backup.tar ».

Теперь, когда вы посмотрите на ${pwd}/backup , вы найдете наш том в формате tar.
До сих пор у нас был образ нашего контейнера «IMAGE_NAME.tar» и его том «volume_backup.tar».

Теперь вы можете воссоздать тот же старый контейнер на новом хосте.

person Houssam Ezzoukh    schedule 17.07.2019

экспорт докеров | gzip › .tar.gz

#новый хост gunzip ‹ /mnt/usb/.tar.gz | импорт докера -

docker run -i -p 80:80 /bin/bash

person thistleknot    schedule 22.03.2021