Как перенести контейнер Docker на другой компьютер

Обновлено: 21.11.2024

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

Сохраните свои данные

Если у вас есть контейнеры с данными, для которых необходимо выполнить резервное копирование, зафиксируйте эти контейнеры в образе с помощью docker container commit .

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

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

Подробнее об использовании этой команды см. на странице фиксации контейнера Docker в справочном разделе командной строки Docker Engine.

Должен ли я создавать резервные копии своих контейнеров?

Если вы используете тома или привязки для хранения данных вашего контейнера, резервное копирование ваших контейнеров может не понадобиться, но обязательно запомните параметры которые использовались при создании контейнера, или используйте файл Docker Compose, если вы хотите воссоздать свои контейнеры с той же конфигурацией после переустановки.

Используйте docker push для отправки любых образов, которые вы создали локально и хотите сохранить в реестре Docker Hub. Обязательно настройте видимость репозитория как «частную» для изображений, которые не должны быть общедоступными. Подробнее об использовании этой команды см. на странице docker push в разделе справочника по командной строке Docker Engine.

В качестве альтернативы используйте docker image save -o images.tar image1 [image2 . ], чтобы сохранить любые изображения, которые вы хотите сохранить, в локальный файл tar. Дополнительные сведения об использовании этой команды см. на странице сохранения образа Docker в разделе справочника по командной строке Docker Engine.

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

После резервного копирования данных вы можете удалить текущую версию Docker Desktop и установить другую версию (Windows macOS или восстановить заводские настройки Docker Desktop по умолчанию).

Восстановить ваши данные

Используйте docker pull для восстановления образов, которые вы отправили в Docker Hub на «шаге 2». в разделе сохранения данных

Если вы создали резервную копию изображений в локальном tar-файле, используйте команду docker image load -i images.tar для восстановления ранее сохраненных изображений.

Подробнее об использовании этой команды см. на странице загрузки образа Docker в разделе справочника по командной строке Docker Engine.

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

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

Сохранить образ контейнера с исходного хоста

Сначала останавливать контейнер не обязательно, но настоятельно рекомендуется это сделать. Вы сделаете снимок данных в своем экземпляре Docker. Если он работает, пока вы это делаете, есть небольшая вероятность, что некоторые файлы могут оказаться неполными в вашем снимке. Представьте, что кто-то загружает файл размером 500 МБ. Когда 250 МБ загружено, вы выполняете команду docker commit. Затем загрузка продолжается, но при восстановлении этого образа Docker на другом хосте может быть доступно только 250 МБ из 500 МБ.

Итак, если можете, сначала остановите экземпляр.

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

Обратите внимание: если экземпляр запущен в данный момент, это действие приостановит его работу на время сохранения его содержимого. Если вы добавили в контейнер много данных, эта операция займет больше времени. Если это проблема, вы можете избежать этой паузы, введя docker commit -p=false NAME_OF_INSTANCE mycontainerimage вместо следующей команды. Однако не делайте этого без крайней необходимости. В этом случае увеличивается вероятность создания изображения с противоречивыми/неполными данными.

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

Теперь сохраните это изображение в файл и сожмите его.

Затем используйте предпочтительный способ передачи файлов и скопируйте mycontainerimage.tar.gz на хост, на который вы хотите перенести свой контейнер.

Загрузить образ контейнера на целевой хост

После входа на хост, на который вы передали образ, импортируйте его в Docker.

Поскольку вы никогда не инициализировали этот контейнер здесь, вы пока не можете запустить его с помощью docker start. Вместо этого введите ту же команду, которую вы использовали в прошлом при первом запуске этого экземпляра Docker. Единственная разница теперь в том, что вы будете использовать «mycontainerimage» в конце вместо любого изображения, которое вы использовали в прошлом.

Следующая команда является просто примером; не копируйте и не вставляйте это, если это не относится к вам. (При первом запуске образа никаких специальных параметров не требовалось)

Напротив, ниже приведен пример команды, в которой параметр --publish требовался для переадресации порта 80 на хост-компьютере на порт 80 в контейнере:

После этого вы можете останавливать и запускать этот контейнер в обычном режиме с помощью команд docker stop и docker start.

Перенос изображения без создания файла

Иногда вам может понадобиться пропустить создание файла mycontainerimage.tar.gz. Возможно, у вас недостаточно места на диске, так как в контейнере много данных. Вы можете сохранять, сжимать, передавать, распаковывать и загружать изображение на целевой хост с помощью одной команды. После запуска команды docker commit, описанной в первом разделе, вы можете использовать это:

Он должен работать и в Windows, так как теперь у него есть встроенный SSH-клиент (PuTTY больше не нужен).

После этого продолжите выполнение команды docker run, которая применима к вашей ситуации.

Заключение

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

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

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

Поскольку он основан на моем собственном образе (например, Red Hat Linux), его нельзя воссоздать из Dockerfile. Мой файл dockerfile нелегко переносить.

Есть ли простые команды, которые я могу использовать? Или другое решение?

19 ответов 19

Вам нужно будет сохранить образ Docker в виде tar-файла:

Затем скопируйте образ в новую систему с помощью обычных средств передачи файлов, таких как cp , scp или rsync (предпочтительно для больших файлов). После этого вам нужно будет загрузить образ в Docker:

PS: возможно, вам придется выполнять все команды sudo.

EDIT: вы должны добавить имя файла (а не только каталога) с -o, например:

Кроме того, в качестве ссылки на изображение лучше использовать repo:tag, а не идентификатор изображения. Если вы используете идентификатор изображения, загруженное изображение не сохранит тег (и вам придется выполнить еще один шаг, чтобы пометить изображение).

Я использовал идентификатор изображения вместо имени:тег. Теперь я сижу здесь, загрузил изображение и имею РЕПОЗИТОРИЙ и ТЕГ. Как правильно вернуть имя и тег? @wisbucky

Чтобы пометить, сначала идентифицируйте идентификатор IMAGE ID с помощью изображений Docker , а затем используйте тег Docker DESIREDIMAGEID mycompany/myreponame . Если идентификатор вашего изображения 591de551d6e4, вы можете сократить идентификатор изображения: тег docker 59 mycompany/myreponame

Передача образа Docker по SSH, сжатие содержимого на лету:

Обратите внимание, что docker load автоматически распаковывает изображения. Он поддерживает gzip , bzip2 и xz .

Также рекомендуется поместить pv в середину канала, чтобы увидеть, как идет передача:

Важное примечание от @Thomas Steinbach: при высокой пропускной способности bzip не сможет сжимать достаточно быстро. Если вы можете загружать со скоростью 10 МБ/с и выше, gzip / gunzip будет намного быстрее, чем bzip2 .

Если вы пользуетесь 3G и у вас медленный Интернет, @jgmjgm предлагает вам использовать xz : он обеспечивает более высокую степень сжатия.

При использовании docker-machine вы можете сделать docker $(docker-machine config mach1) save | docker $(docker-machine config mach2) load для копирования образов между машинами mach1 и mach2.

@manojlds eval $(docker-machine env dev) подходит для общего взаимодействия с одним хостом докеров, но не для копирования между двумя компьютерами, так как это включает два разных хоста докеров/машины докеров.

чтобы сделать это в обратном порядке (от удаленного к локальному): ssh target_server 'docker save image:latest | bzip2' | пв | распаковка2 | загрузка докера

Есть ли способ сделать это, когда docker требует sudo на целевой машине? Я пробовал (без сжатия) docker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load . Без переключателя "-t" sudo жалуется sudo: извините, для запуска sudo у вас должен быть tty; с одним "-t" это то же самое сообщение, потому что ssh говорит, что Псевдо-терминал не будет выделен, потому что stdin не является терминалом. и, наконец, с двумя "-t" я получаю содержимое файл tar (то есть изображение) на моем терминале. Есть идеи?

@JosefStark Мне нужно было добавить «По умолчанию: !requiretty» при редактировании файла sudoers, чтобы остановить сообщение «Извините» от sudo. Я не знаю, насколько это важно, но я также помещаю все после user@host в кавычки (так что «[. ] | ssh user@host 'bunzip2 | sudo docker load'»).

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

Получите идентификатор изображения, выполнив:

Скажем, у вас есть изображение с идентификатором "matrix-data".

Сохранить изображение с идентификатором:

Скопируйте изображение с пути на любой хост. Теперь импортируйте в локальную установку Docker, используя:

Вы можете использовать однострочник с переменной DOCKER_HOST:

предварительные требования: настройка учетных данных ssh на удаленном компьютере (ssh-copy-id), а локальный и удаленный пользователи должны быть в группе docker (sudo usermod -aG docker $USER)

Сначала сохраните образ Docker в сжатый архив:

Затем загрузите экспортированное изображение в Docker с помощью следующей команды:

Для загрузки достаточно загрузки докера. Изображение автоматически распаковывается для форматов gzip, bzip2 и xz.

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

Скопируйте tar-файл на флэш-накопитель или что-то еще, а затем скопируйте его на новый хост-компьютер.

Теперь с нового хоста выполните:

Теперь выпейте кофе и почитайте новости о хакерах.

Стоит отметить, что это будет работать только в том случае, если сохранение и загрузка выполняются в одной и той же ОС. Чтобы избежать этого, используйте docker save [image] -o file.tar и docker load -i file.tar!

Для упрощенного экспорта файловой системы контейнера используйте;

экспорт в докер CONTAINER_ID > my_container.tar

Используйте cat my_container.tar | docker import - для импорта указанного изображения.

это должен быть cat my_container.tar | импорт докеров - my_container: новый, если импортируется локально в соответствии с справкой cmd

Я попытался сохранить Docker на компьютерах с Ubuntu, на которых все образы Docker работают нормально. Затем я докер загружаю их на машину Windows. Есть много ошибок, когда я запускаю докер или запускаю их. Есть идеи, что не так?

docker-push-ssh — это утилита командной строки, которую я создал специально для этого сценария.

Он устанавливает временный частный реестр Docker на сервере, устанавливает туннель SSH с вашего локального хоста, отправляет ваш образ, а затем очищает себя.

Преимущество этого подхода по сравнению с сохранением в докере (на момент написания большинства ответов используется этот метод) заключается в том, что на сервер отправляются только новые слои, что приводит к НАМНОГО более быстрой загрузке.

Часто использование промежуточного реестра, такого как dockerhub, нежелательно и обременительно.

Самое большое предостережение заключается в том, что вам нужно вручную добавить свой локальный хост в конфигурацию insecure_registries Docker. Запустите инструмент один раз, и он выдаст информативную ошибку:

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

В качестве поставщиков технической поддержки для веб-хостинговых компаний и поставщиков инфраструктуры мы предоставляем и управляем системами Docker для их целей.

Перенос контейнеров Docker часто является частью этой задачи. Сегодня мы увидим различные способы перемещения контейнера Docker на другой хост с существующего хоста.

Как переместить контейнер Docker на другой хост

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

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

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

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

К новому контейнеру, созданному на новом хосте, можно получить доступ с помощью команды «docker run».

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

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

2. Перенос образа контейнера

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

Для контейнера, который необходимо переместить, сначала его образ Docker сохраняется в сжатый файл с помощью команды «docker commit».

Созданное изображение сжимается и перемещается на новый хост-компьютер. На новом хосте новый контейнер создается с помощью «docker run».

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

3. Сохранение и загрузка изображений

Образ Docker – это пакет кода, библиотек, файлов конфигурации и т. д. для приложения. Контейнеры Docker создаются из этих образов.

Изображения можно сжать с помощью функции "docker save" и перенести на новый хост.

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

4. Перенос томов данных

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

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

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

Еще один надежный способ – создать резервную копию и восстановить том данных, передав параметр --volumes-from в команде docker run.

Здесь имя-данного-тома — это /путь/к/тому. Эта команда обеспечивает резервное копирование тома данных. Чтобы указать рабочий каталог, мы также можем указать -w /backup. Резервную копию, созданную в папке /backup, можно переместить на новый хост с помощью инструментов scp или ftp.

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

5. Переместить целые контейнеры Docker

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

Этот метод включает копирование всего каталога «/var/lib/docker» на новый хост. Чтобы сделать этот метод успешным, необходимо обеспечить несколько критических точек.

  • Разрешения и права собственности на папки сохраняются.
  • Служба Docker остановлена ​​перед перемещением.
  • Версии Docker на двух хостах проверены на совместимость.
  • Список контейнеров и их функциональность проверяются до и после перемещения.
  • Пути к точкам входа и другим файлам конфигурации сохраняются.

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

Заключение

Контейнеры Docker широко используются в DevOps и специализированном веб-хостинге. Сегодня мы обсудили различные способы, которыми наши инженеры службы поддержки Docker перемещают контейнер Docker на другой хост в инфраструктуре Docker, которой мы управляем.

Похожие сообщения:

ЗАЩИТИТЕ ВАШ СЕРВЕР ОТ СБОЯ!

Никогда больше не теряйте клиентов из-за низкой скорости сервера! Позвольте нам помочь вам.

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

Это отличная статья. Несколько советов по разделу 4, которые мне помогли.

–volumes-from datavolume-name будет более понятным, если его изменить на –volumes-from

/path/to/volume будет понятнее как /container/volume/mount/point/

-w /backup также требуется, чтобы ваш tar-архив был создан в смонтированном каталоге хоста с помощью параметра -v.

Это отличная статья. Несколько советов по разделу 4, которые мне помогли.

–volumes-from datavolume-name будет более понятным, если его изменить на –volumes-from

/path/to/volume будет понятнее как /container/volume/mount/point/

-w /backup также требуется, чтобы ваш tar-архив был создан в смонтированном каталоге хоста с помощью параметра -v.

Здравствуйте,
Рад узнать, что статья помогла вам.
Спасибо за подсказку. Отредактированы команды, чтобы внести ясность.

В идеальном случае передача образов Docker осуществляется через реестр Docker или через полностью управляемого поставщика, такого как ECR AWS или GCR Google. Вы можете легко загрузить изображение с помощью команды docker push, а другие могут получить изображение с помощью команды docker pull.

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

Docker поддерживает два разных метода сохранения образов контейнеров в один архив.

    - Сохранение используется для сохранения изображения (не контейнера) - Экспорт используется для сохранения контейнера (не изображения)

Использование команды Docker Save:

Сохранение образа Docker:

Во-первых, мы будем придерживаться плана, то есть сохраняем только изображение. Теперь давайте рассмотрим команду сохранения докера. Предположим, вам нужен образ Python с Alpine, который можно загрузить с Docker Hub:

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

Просто убедитесь, что вы используете точное имя образа и тег во время создания tar. В нашем случае это был python:2.7.17-alpine3.9. Вы можете проверить, сработала ли приведенная выше команда:

Теперь вы можете отправить файл .tar другому человеку с помощью rsync, scp или аналогичного протокола передачи файлов в соответствии с вашими предпочтениями.

Загрузка образа Docker:

После того, как на целевой машине будет файл .tar, вы можете загрузить образ в локальный реестр с помощью команды docker load :

Теперь перепроверьте, есть ли этот образ на целевой машине, используя образы Docker или список образов Docker . Конечный результат будет примерно таким:

Использование команды Docker Export:

Экспорт контейнера Docker:

Примечание. Команда docker export не будет экспортировать содержимое тома, прикрепленного к контейнеру. В этом случае вам нужно запустить дополнительную команду для резервного копирования, восстановления или миграции существующего тома. Подробнее об этом можно прочитать здесь.

Глядя на метод docker export, сначала мы извлечем образ Alpine:

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

Чтобы получить идентификатор контейнера и имя, которое мы создали, мы можем использовать команду docker ps. На всякий случай, если на вашем компьютере контейнер по какой-то причине остановился/был остановлен, вы все равно можете получить идентификатор и имя с помощью docker ps -a :

Как мы видим, идентификатор нашего контейнера — 35f34fabfa84 (у вас он будет другим), или вы также можете использовать имя контейнера; в нашем случае это alpine-t. Теперь мы можем запустить команду docker export для экспорта образа экземпляра:

Кроме того, вы также можете использовать OPTIONS, чтобы сделать то же самое, и ваш файл .tar будет готов к передаче.

Импорт контейнера Docker:

Теперь вы можете импортировать файл .tar на целевую машину с помощью импорта Docker:

Для проверки вы можете запустить контейнер с помощью --rm (он уничтожит контейнер после его запуска):

Читайте также: