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

Обновлено: 01.07.2024

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

На сервере назначения (192.10.2.5):

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

4 ответа

Там нет базы данных, потому что команды docker save и docker commit не сохраняют тома контейнера .

Вот скрипт для этого:

Ваш контейнер был основан на изображении при запуске, но после запуска все изменения не будут влиять на изображение.

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

Примерно так: см. здесь.

Затем сохраните новое изображение в tar и сделайте то, что вы хотели.

Зафиксировать текущее состояние изображения

Сохранить изображение как файл tar

Загрузить контейнер с картинки

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

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

Теперь вы можете делать с контейнером все, что захотите, даже docker rm его, но до тех пор, пока /data/mysql на вашем хосте не затрагивает ваши данные Это хорошо. Это также означает, что вы можете использовать обычный scp для копирования данных на другой хост и docker run там же контейнер, что является более типичным путем миграции.

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

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

Сами изображения должны быть построены из Dockerfiles и, как и все остальное в вашем приложении, должны быть включены в систему контроля версий. В идеале у вас есть автоматизированная система сборки (непрерывная интеграция), запускающая docker build && docker push для вас. Никогда не используйте docker commit или docker export : это рецепт для получения разных версий программного обеспечения в разных системах и не запоминания того, как вы туда попали.

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

Локально вы должны иметь возможность docker stop; docker rm; docker run свободно использовать один и тот же контейнер и не терять данные. Проверьте это, прежде чем выполнять миграцию между хостами.

Если вы можете структурировать свое приложение так, чтобы все его данные находились во внешней базе данных, рассмотрите возможность запуска базы данных на выделенном хосте с чрезвычайно хорошими процедурами резервного копирования. Если вы сделали все до этого момента, вы можете получить серьезный скоординированный сбой жесткого диска и потерять все ваши хосты Docker, а на самом деле ничего не потерять (потому что вы можете docker build снова получить изображения из источника и < > контейнеры и данные вне хоста).

Хочу выяснить момент с переносом Docker контейнера с данными.

Делаю следующее поднял 2 сервера Ubuntu 16.04. На обоих поднял Docker.

На первом сделал контейнер с PostgreSQL, создал несколько тестовых баз, таблиц. Далее делаю по инструкции commit - save - load(на втором сервере) данных которые я менял в PostgreSQL - нет.

Ладно, думаю буду пробовать export/import - после этих процедур, на втором сервере создается контейнер но не стартует.

И вот сижу в недоумении, что не так? Может я не так понимаю технологию Dockera?

Помогите, читал этот пост: Где docker хранит контейнеры?, и запутался еще больше. Если есть save/load и export/import (разница мне тоже не ясна), зачем все эти "танцы с бубном" с переносом "volumes"?


2,301 6 6 золотых знаков 18 18 серебряных знаков 32 32 бронзовых знака

команды save / load сохраняют/восстанавливают образ (image), а команды export / import сохраняют/восстанавливают контейнер (container).

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

а архив с образом (создаваемый командой save ) содержит и (вложенный) архив с файловой системой (их может быть даже несколько — это т.н. слои (layers)) и дополнительную мета-информацию (файлы manifest.json , repositories и т.п.):

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

volume же — это монтируемый внутрь запускаемого контейнера каталог вашей локальной машины. содержимое этого каталога доступно процессу, запущенному «в контейнере» (только для чтения или для чтения/записи — вы определяете сами соответствующей опцией при запуске контейнера).

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

volume может быть указан либо в командной строке при запусе контейнера, либо в dockerfile, либо создан как отдельная сущность командой volume create .

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

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

любая помощь приветствуется.

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

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

альтернативно, если вы не хотите нажимать на репозиторий:

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

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

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

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

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

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

О том, как коммитить изменения в Docker образ

Джек Уаллен, 27 апреля 2017

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

image



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

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

Если все это выглядит как процесс, который вы хотите внедрить, удача на вашей стороне — это действительно довольно просто. Скажем, вам нужен образ, базирующийся на последней версии nginx, с установленными PHP, build-essential и nano. Я проведу вас через процесс pull'а образа, запуска контейнера, подключения к нему, добавления программного обеспечения и коммита изменений в новый образ, который может быть запросто использован как базовый для ваших контейнеров.

Pull образа и запуск контейнера

Первый шаг — pull последнего образа nginx. Это выполнено командой:

docker pull nginx

Как только образ загружен, мы можем запустить его, так что мы можем использовать окно терминала таким образом:

docker run --name nginx-template-base -p 8080:80 -e TERM=xterm -d nginx

Я назвал его nginx-template-base, так как это будет то, на чем наш шаблон будет основан.

Подключение и модификация контейнера

Дальше нам нужно получить доступ к контейнеру. Когда вы запустите команду docker run, она покажет вам длинный идентификатор. Запустите команду:

docker exec -it CONTAINER_ID bash

Где CONTAINER_ID — это ID, показынный на экране, когда вы запустили команду run.

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

apt-get install nano
​apt-get install build-essential
​apt-get install php5

Заметка: для официального образа nginx PHP 7 недоступен для установки без добавления репозитория.

Выйдите из контейнера и закоммитьте изменения

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

docker commit CONTAINER_ID nginx-template

Где CONTAINER_ID — ID, данный вам, когда вы первоначально запустили контейнер.

Если вы запустите команду docker images, вы увидите новый контейнер (Иллюстрация B):

image


Иллюстрация В. Свежесозданный шаблон образа готов к использованию.

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

docker run --name nginx-dev -p 8080:80 -e TERM=xterm -d nginx-template

Если вы войдете в этот новый контейнер (используя команду docker exec), вы увидите, что все установленное на месте и готово к использованию.

Легкий путь к шаблонам контейнеров

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

Руководство по перемещению Docker контейнеров

Рик Донато, 28 октября 2016.

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

Из репозитория в репозиторий

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

Команда docker pull используется для того, чтобы получить образ из репозитория.

$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912
Status: Image is up to date for busybox:latest

Для перемещения образов из репозитория в репозиторий используется docker push. Ниже показаны шаги, затрагивающие push образа в репозиторий.

  1. Аутентификация — если она требуется репозиторием, то выполняется командой docker login
  2. Пометка тегом — обеспечивается командой docker tag
  3. Push — для этого используется команда docker push

С хоста на хост

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

EXPORT или SAVE

Хорошо, давайте взглянем на команды docker export и docker save. docker export сохраняет запущенный или поставленный на паузу экземпляр ([2]) контейнера в tar файл. docker save сохраняет образ в tar файл.

Ниже примеры этих двух команд:

$ docker ps
CONTAINER ID IMAGE COMMAND
5e8f397be6fa busybox «sh»

$ docker export 5e8f397be6fa -o busybox-container.tar

$ docker images
REPOSITORY TAG IMAGE ID
busybox latest e02e811dd08f

$ docker save -o busybox-image.tar busybox

IMPORT или LOAD

Наконец, к с первоначально созданном tar файлам применяются команды docker import и docker load.

docker import используется для импортирования tar файла (т.е. контейнера), созданного через docker export. docker load для загрузки tar файла (т.е. образа), созданного через docker save.

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