Перенос docker контейнера на другую машину
Как перемещать контейнеры docker между разными хостами
Я не могу найти способ перемещения докера с контейнерами с одного хоста на другой.
любая помощь приветствуется.
4 ответов
вы не можете переместить работающий контейнер docker с одного хоста на другой.
альтернативно, если вы не хотите нажимать на репозиторий:
1) экспорт контейнера в tarball
2) переместите свой tarball на новую машину
3) импортируйте его обратно
из документации Docker:
docker export не экспортирует содержимое связанных томов с контейнером. Если том установлен поверх существующего каталог в контейнере, docker export экспортировать содержимое из базовый каталог, а не содержимое тома. Относиться к резервное копирование, восстановление и перенос данных Тома в руководстве пользователя для примеров экспорта данных в объем.
другие внешние инструменты: Для перемещения контейнера со связанным с ним Томом данных можно использовать Flocker https://clusterhq.com/flocker/introduction/
экспорт и импорт, как предложено в других ответах не экспортирует порты и переменные, которые могут потребоваться для запуска контейнера. И вы можете закончить с такими вещами, как «команда не указана» etc. Когда вы пытаетесь загрузить его на другую машину.
таким образом, разница между save и export заключается в том, что команда save сохраняет весь образ с историей и метаданными, а команда export экспортирует только структуру файлов (без истории или метаданных).
Перенос Docker контейнера с данными
Хочу выяснить момент с переносом Docker контейнера с данными.
Делаю следующее поднял 2 сервера Ubuntu 16.04. На обоих поднял Docker.
И вот сижу в недоумении, что не так? Может я не так понимаю технологию Dockera?
Помогите, читал этот пост: Где docker хранит контейнеры?, и запутался еще больше. Если есть save/load и export/import (разница мне тоже не ясна), зачем все эти «танцы с бубном» с переносом «volumes»?
2 ответа 2
команды save / load сохраняют/восстанавливают образ (image), а команды export / import сохраняют/восстанавливают контейнер (container).
если заглянуть внутрь создаваемых файлов, то видно, что архив с контейнером (создаваемый командой export ) представляет собой всего лишь «банальную» файловую систему, которая и используется в качестве корневой для запускаемого процесса (на всякий случай напомню: программа docker именно и предназначена для запуска одного процесса в изолированном окружении, т.е. «в контейнере»).
команда commit служит для создания образа из указанного контейнера. процесс, работающий «внутри контейнера», перед выполнением команды имеет смысл остановить — например, если это процесс сервера баз данных, то при остановке он должен сохранить всю информацию из оперативной памяти в соответствующие файлы.
volume же — это монтируемый внутрь запускаемого контейнера каталог вашей локальной машины. содержимое этого каталога доступно процессу, запущенному «в контейнере» (только для чтения или для чтения/записи — вы определяете сами соответствующей опцией при запуске контейнера).
если вы подключаете какой-нибудь каталог, а процессу «внутри контейнера», например, серверу баз данных, говорите создать базу данных именно в подключенном каталоге, то даже после удаления контейнера все файлы базы данных сохранятся у вас в локальном каталоге.
Где искать настройки докера? Нужно перенести на другой сервер
Вот такой вопрос: нужно перенести docker контейнеры на другой сервер. Работал только с lxc и то немного. Где искать его конфиги? Вот установлю я docker, а в кроне прописано docker restart container1. Ведь где-то прописан путь к контейнеру, раз он вызывается без пути? Вот вопрос где?
Нигде. Ковыряй docker inspect container1 и додумывай, с какими параметрами он запускался (там в принципе всё есть).
PPS: а вообще, с такими запросами, делегируй задачу кому-нибудь, кто в этом разбирается.
TL;DR: сами контейнеры никому не нужны, нужны их параметры и данные.
На первом сервере уже все остановлено.
Контейнеры не предназначены для переноса. Подразумевается, что они собираются из скрипта и работают. Поэтому например им левой пяткой приклось впиливать хранилища данных (named volumes), и поэтому при ребуте контенеры пересоздаются.
А вообще да, они действительно лежат где-то около корневого раздела, я даже переносил их на отдельный диск, но не по отдельности, а всем скопом.
Подскажи как всем скопом? И где искать named volumes?
Нашел файл docker-compose.yml
Там следующее:
А вот это как раз тебе очень поможет.
Копируй содержание этой директории на другой хост. И ещё не забудь содержание volumes. В частонсти /data/db и /root/sours
Документацию к docker-compose и как его установить, надеюсь сам найдёшь.
полагаю хранятся вместе с обычными, но не разбирался, могу ошибаться
Перевод двух статей: «О том, как коммитить измнения в Docker образ» и «Руководство по перемещению Docker контейнеров»
О том, как коммитить изменения в Docker образ
Джек Уаллен, 27 апреля 2017
Если вам нравится использовать докер образы в качестве шаблонов для эффективного деплоя контейнеров, Джек Уоллен покажет вам, как коммитить изменения в запущенный контейнер для создания нового докер образа.
Один способ, которым ваша компания может обращаться с докер контейнерами — создание шаблонных образов для использования в ваших контейнерах. Скажем, для примера, вы используете контейнеры в целях разработки и хотите быть уверены, что все задеплоенные контейнеры стартуют с тем же самым базовым набором инструментов. Вы можете сделать pull образа, запустить контейнер, модифицировать его для того, чтобы он удовлетворял вашим потребностям, а затем начать разработку с этим контейнером, но вы должны будете повторять тот же самый процесс каждый раз, когда вам нужно будет деплоить этот контейнер.
Или же, вы можете сделать pull образа, запустить контейнер, модифицировать его, чтобы он удовлетворял основным потребностям ваших разработчиков, и закоммитить эти изменения в новый образ. Теперь, все, что нужно вашим разработчикам — запустить новый контейнер, базирующийся на модифицированном образе, и они могут это сделать. Им нет нужны модифицировать для этого исходный образ.
Если все это выглядит как процесс, который вы хотите внедрить, удача на вашей стороне — это действительно довольно просто. Скажем, вам нужен образ, базирующийся на последней версии nginx, с установленными PHP, build-essential и nano. Я проведу вас через процесс pull’а образа, запуска контейнера, подключения к нему, добавления программного обеспечения и коммита изменений в новый образ, который может быть запросто использован как базовый для ваших контейнеров.
Pull образа и запуск контейнера
Первый шаг — pull последнего образа nginx. Это выполнено командой:
Как только образ загружен, мы можем запустить его, так что мы можем использовать окно терминала таким образом:
Я назвал его nginx-template-base, так как это будет то, на чем наш шаблон будет основан.
Подключение и модификация контейнера
Дальше нам нужно получить доступ к контейнеру. Когда вы запустите команду docker run, она покажет вам длинный идентификатор. Запустите команду:
Где 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):
Иллюстрация В. Свежесозданный шаблон образа готов к использованию.
В этом пункте, вы можете подготовить к запуску новый контейнер, используя новый образ, имея все модификации на месте. Запомните. когда вы запускаете новый контейнер, команда будет выглядать примерно так:
Если вы войдете в этот новый контейнер (используя команду 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 будеть пуллить из docker.io. Для пулла из другого репозитория добавьте имя хоста вашего реестра к команде docker pull, т.е. docker pull registry.fir3net.com/busybox ([1]).
Для перемещения образов из репозитория в репозиторий используется docker push. Ниже показаны шаги, затрагивающие push образа в репозиторий.
// LOGIN
$ docker login registry.fir3net.com
Username: felix001
Password:
Login Succeeded
// TAG
$ docker tag busybox registry.fir3net.com/busybox-v0.0.1
// PUSH
$ docker push registry.fir3net.com/busybox-v0.0.1
The push refers to a repository [registry.fir3net.com/busybox-v0.0.1] (len: 1)
Sending image list
Pushing repository registry.fir3net.com/busybox-v0.0.1 (1 tags)
d3a1f33e8a5a: Image successfully pushed
c22013c84729: Image successfully pushed
d74508fb6632: Image successfully pushed
91e54dfb1179: Image successfully pushed
Pushing tag for rev [91e54dfb1179] on
С хоста на хост
Мы можем взять локальный образ или контейнер и затем сделать его загрузку или импорт в другую Docker среду.
EXPORT или SAVE
Хорошо, давайте взглянем на команды docker export и docker save. docker export сохраняет запущенный или поставленный на паузу экземпляр ([2]) контейнера в tar файл. docker save сохраняет образ в tar файл.
Ниже примеры этих двух команд:
$ docker ps
CONTAINER ID IMAGE COMMAND
5e8f397be6fa busybox «sh»
$ docker images
REPOSITORY TAG IMAGE ID
busybox latest e02e811dd08f
IMPORT или LOAD
Наконец, к с первоначально созданном tar файлам применяются команды docker import и docker load.
docker import используется для импортирования tar файла (т.е. контейнера), созданного через docker export. docker load для загрузки tar файла (т.е. образа), созданного через docker save.
Docker — как импортировать существующую машину?
Начал знакомиться с Docker. И возник такой вопрос:
Возможно ли создать образ докера работающего сервера (LAMP)?
Если да то хотелось бы какую то достаточно подробную инструкцию или где об этом почитать.
Так все таки возможно ли импортировать в образ уже работающую систему?
Заранее спасибо за ответы.
Вам поможет Docker-Compose.
Он позволит скачать отдельный образ докера (PHP, Nginx\Apache, *SQL) и настроить их под себя.
Думаю данная статья поможет вникнуть https://www.digitalocean.com/community/tutorials/h.
А вот эта покажет как собрать docker-compose с PHP и MySQL https://docs.docker.com/compose/wordpress/
Вам нужно скопировать вашу систему в отдельную папку, за исключением таких директорий как /sys, /proc и /dev. После этого передать содержимое этой папки в tar и по конвейеру передать в скрипт docker-import.
Почитайте на тему того как создавать baseimage. Так же, для лучшего понимания происходящего вам не помешают навыки установки linux вручную, или хотя бы понимание того, как работает chroot.
Но вообще это не true way, лучше действительно создать новый образ из чистого
baseimage или использовать уже готовый, и импортнуть в него ваши конфиги. Если вы боитесь закладок в чужих образах, ищите automated build образы и смотрите в Dockerfile, удачи 🙂