2015-09-26 3 views
3

Я хотел бы клонировать прикрепленное приложение, включая все его данные, в котором в этом примере используются три контейнера: 1) контейнер веб-приложения, такой как CMS, 2) контейнер базы данных и 3) контейнер объема данных (с использованием докеры томов).Сценарий для клонирования/снимка Докерные контейнеры, включая их данные?

С компоновкой докеров я могу легко создать идентичные экземпляры этих контейнеров только с начальными данными. Но что, если я хочу клонировать набор запущенных контейнеров на одном сервере, включая все его накопленные данные, аналогично тому, как я бы клонировал контейнер KVM? С KVM я бы приостановил или выключил виртуальную машину, клонировал что-то вроде virt-clone, а затем начал клонированный гость, который имеет все те же данные, что и оригинал.

Одним из вариантов использования было бы создание клона/моментального снимка работающего веб-сервера разработки перед внесением серьезных изменений или перед установкой новых версий плагинов.

С Docker это не кажется таким простым, поскольку данные не копируются автоматически вместе с контейнером. В идеале я хотел бы сделать что-то простое, например docker-compose clone, и в итоге получить второй набор контейнеров, идентичный первому, включая все их данные. Ни Docker, ни docker-compose не предоставляют команду clone (начиная с версии 1.8), поэтому мне нужно будет рассмотреть различные подходы, например резервное копирование &, восстановление данных/базы данных или использование стороннего инструмента, такого как Flocker.

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

Что было бы предпочтительным способом Докера для достижения этих целей?

Редактировать: Основываясь на первом ответе, я сделаю свой вопрос немного более конкретным, чтобы, надеюсь, прийти к программным шагам, чтобы иметь возможность делать что-то вроде docker-compose-clone и docker-compose-snapshot с использованием сценария bash или python. Клонирование содержимого томов докеров становится для него ключом, так как сами контейнеры в основном клонируются каждый раз, когда я запускаю docker-compose в одном и том же файле yaml.

Вообще мой полный клон сценарий должен был бы

  1. дублировать каталог, содержащий файл докер-создания сообщения
  2. временно остановить контейнеры
  3. создания (но не обязательно запускать) второй набор контейнеров
  4. определяют-объемы данных, которые будут дублироваться
  5. резервного копирования этих данных-томов
  6. восстановление-объемов данных в клонированный контейнер данных
  7. начать второй набор контейнеров

    • Будет ли это правильный путь, о нем и как я должен реализовать это? Я особо не уверен, как сделать шаг 4 (определить тома данных, которые будут дублироваться) в сценарии, так как команда docker volume ls будет доступна только в Docker 1.9.

    • Как я могу сделать что-то похожее на снимки KVM, используя этот подход? (возможно, используя функции файловой системы COW из ZFS, которые моя установка Docker уже использует).

ответ

0

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

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

Если вы используете хост-хост, вы можете управлять состоянием извне из докера.

+0

Да, как указано в вопросе, я уже использую контейнеры объема данных (теперь я сделал формулировку немного понятнее).Я бы предпочел не использовать контейнеры-хосты, поскольку они менее переносимы. AFAIK Docker 1.9 добавит 'docker volume create, inspect, ls, rm' [commands] (https://github.com/docker/docker/tree/master/man), которые не совсем предоставляют необходимые функции для клонирования. Были ли у вас какие-либо предложения о том, как _determine томов данных, которые должны быть дублированы в сценарии? – ChrisW

0

В настоящее время я использую следующий скрипт для клонирования докционированного веб-приложения CMS Concrete5.7 на основе описанного выше подхода. Он создает второй набор идентичных контейнеров, используя docker-compose, затем он создает резервные копии только данных из томов данных и восстанавливает их в контейнерах данных во втором наборе.

Это может служить примером для разработки более обобщенный сценарий:

#!/bin/bash 
set -e 

# This script will clone a set of containers including all its data 

# the docker-compose.yml is in the PROJ_ORIG directory 
# - do not use capital letters or underscores for clone suffix, 
# as docker-compose will modify or remove these 
PROJ_ORIG="c5app" 
PROJ_CLONE="${PROJ_ORIG}003" 

# 1. duplicate the directory containing the docker-compose file 
cd /opt/docker/compose/concrete5.7/ 
cp -Rv ${PROJ_ORIG}/ ${PROJ_CLONE}/ 

# 2. temporarily stop the containers 
cd ${PROJ_ORIG} 
docker-compose stop 

# 3. create, run and stop the second set of containers 
# (docker-compose does not have a create command) 
cd ../${PROJ_CLONE} 
docker-compose up -d 
docker-compose stop 

# 4. determine the data-volumes to be duplicated 
# a) examine which containers are designated data containers 
# b) then use docker inspect to determine the relevant directories 
# c) store destination directories & process them for backup and clone 
# 
# In this appliaction we use two data containers 
# (here we used DATA as part of the name): 
# $ docker-compose ps | grep DATA 
#  c5app_DB-DATA_1 /true       Exit 0 
#  c5app_WEB-DATA_1 /true       Exit 0 
# 
# $ docker inspect ${PROJ_ORIG}_WEB-DATA_1 | grep Destination 
#  "Destination": "/var/www/html", 
#  "Destination": "/etc/apache2", 
# 
# $ docker inspect ${PROJ_ORIG}_DB-DATA_1 | grep Destination 
#  "Destination": "/var/lib/mysql", 

# these still need to be determined manually from examining 
# the docker-compose.yml or using the commands in 4. 
DATA_SUF1="_WEB-DATA_1" 
VOL1_1="/etc/apache2" 
VOL1_2="/var/www/html" 

DATA_SUF2="_DB-DATA_1" 
VOL2_1="/var/lib/mysql" 

# 5. Backup Data: 
docker run --rm --volumes-from ${PROJ_ORIG}${DATA_SUF1} -v ${PWD}:/clone debian tar -cpzf /clone/clone${DATA_SUF1}.tar.gz ${VOL1_1} ${VOL1_2} 
docker run --rm --volumes-from ${PROJ_ORIG}${DATA_SUF2} -v ${PWD}:/clone debian tar -cpzf /clone/clone${DATA_SUF2}.tar.gz ${VOL2_1} 

# 6. Clone Data: 
# existing files in volumes need to be deleted before restoring, 
# as the installation may have created additional files during initial run, 
# which do not get overwritten during restore 
docker run --rm --volumes-from ${PROJ_CLONE}${DATA_SUF1} -v ${PWD}:/clone debian bash -c "rm -rf ${VOL1_1}/* ${VOL1_2}/* && tar -xpf /clone/clone${DATA_SUF1}.tar.gz" 
docker run --rm --volumes-from ${PROJ_CLONE}${DATA_SUF2} -v ${PWD}:/clone debian bash -c "rm -rf ${VOL2_1}/* && tar -xpf /clone/clone${DATA_SUF2}.tar.gz" 

# 7. Start Cloned Containers: 
docker-compose start 

# 8. Remove tar archives 
rm -v clone${DATA_SUF1}.tar.gz 
rm -v clone${DATA_SUF2}.tar.gz 

Свои испытанные и работает, но до сих пор имеет следующие ограничения:

  • на-объемы данных, которые будут дублироваться необходимо определить вручную и
  • сценарий необходимо изменить, в зависимости от количества контейнеров данных и объемов данных
  • re нет возможности мгновенного выстрела/восстановления

Я приветствую любые предложения по улучшению (особенно шаг 4.). Или, если кто-то придумает другой, лучший подход, я бы принял это вместо ответа.

Приложение, используемое в этом примере, вместе с файлом докер-compose.yml можно найти here.

0

В Windows есть порт с открытым исходным кодом контейнера проекта Docker, доступных из Windocks, что делает то, что вам нужно. Существует два варианта:

  1. Базы данных меньшего размера копируются в контейнеры посредством команды Добавить базу данных, заданной при создании изображения. После этого каждый контейнер, построенный из этого, автоматически получает базу данных.
  2. Для больших баз данных существует функция клонирования. Базы данных клонируются во время создания контейнеров, а клоны выполняются в секундах даже для баз данных размера терабайта. Удаление контейнера также автоматически удаляет клон. В настоящее время он доступен только для SQL Server.

    См. here для получения дополнительной информации о добавлении и клонировании базы данных.

Смежные вопросы