Як переміщувати контейнери Docker між різними хостами?


98

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

Чи можна якось пересунути свої контейнери до сховищ, як це робимо для зображень? В даний час я не використовую обсяги даних для зберігання даних, пов’язаних із програмами, що працюють всередині контейнерів. Отже, деякі дані містяться всередині контейнерів, які я хочу зберегти, перш ніж перепроектувати налаштування.


Подивіться на flocker github.com/ClusterHQ/flocker
Adrian Mouat

Зауважте, що ви можете використовувати збереження / завантаження замість експорту / імпорту, оскільки збереження зберігає метадані та історію.
Бурстаголік,

Це повинен бути коментар до відповіді @ aholt?
Мартін Томпсон,

docker saveпризначений для збереження зображень, а не контейнерів. docs.docker.com/engine/reference/commandline/save
stmllr

Відповіді:


57

Ви не можете перемістити запущений контейнер докера з одного хоста на інший.

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

Nb: не зберігає дані, які зберігаються всередині томів; вам потрібно перемістити обсяги даних вручну на новий хост.


@larsks Не спочатку слід зупинити контейнер, а потім виконати фіксацію?
valentt

@valentt І те, і інше можна здійснити запущений та зупинений контейнер
crollywood

1
Ця відповідь насправді не пояснює точно команд, які вам потрібно використовувати, що ускладнює такий нуб, як я
Пол Крюгер

docker-checkpoint може дозволити вам переміщати "запущений" контейнер між хостами, якщо вони обидва підтримують CRIU.
dGRAMOP

2
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)
Lau Real

95

Якщо ви не хочете переходити до сховища:

  1. Експортуйте контейнер у tarball

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

  3. Імпортуйте його назад

    cat /home/export.tar | docker import - some-name:latest
    

8
Також не зберігає дані, що зберігаються всередині томів.
stmllr

1
Як це має працювати? Після імпорту я отримую нове зображення, і що тоді? Просто виконати нову команду запуску?
valentt

2
Це насправді дуже погана пропозиція, особливо для контейнерів, на яких запущена база даних. Я спробував цю пропозицію, і вона не спрацювала. Чи може це спрацювати із зупинкою контейнера спочатку?
valentt

2
Ця пропозиція насправді була призначена лише для альтернативи. Це може підійти для вашої ситуації, а може - ні. На той час я налаштовував контейнери докера реплікації баз даних, а для експорту / імпорту не піклувався про збереження даних, оскільки я регулярно виконував резервне копіювання даних бази даних в інший tarball. Для цього це спрацювало чудово.
aholt

32

Зрештою, після багатьох заплутаних посібників та заплутаних навчальних посібників, у мене вдалося, оскільки Докер, очевидно, на момент написання мого допису заглядав до завищених очікувань :

  1. Збережіть зображення докера в архів:
    docker save image_name > image_name.tar
  2. копіювати на інший апарат
  3. на цій іншій докер-машині запустіть завантаження докера наступним чином:
    cat image_name.tar | docker load

Експорт та імпорт, як пропонується в інших відповідях, не експортує порти та змінні, які можуть знадобитися для запуску вашого контейнера. І у вас можуть з’явитися такі речі, як «Команда не вказана» тощо ... Коли ви намагаєтесь завантажити її на іншу машину.

Отже, різниця між збереженням та експортуванням полягає в тому, що команда save зберігає ціле зображення з історією та метаданими, тоді як команда експорту експортує лише структуру файлів (без історії та метаданих).

Само собою зрозуміло, що якщо у вас вже є ті порти, зайняті на гіпервізорі докера, який ви виконуєте, імпортується, яким-небудь іншим контейнером докера, ви потрапите в конфлікт, і вам доведеться переналаштувати відкриті порти.


1
Надзвичайно корисний. Повідомлення "Не вказано команди" зводило мене з розуму.
Rintoul

Повідомлення "Не вказано команду" зводило мене з розуму теж. Я використовую docker коміт <container-id> stackstorm-local: 2.9, а docker витягує stackstorm-local: 2.9 з іншого хоста.
Хуа Чжан,

18

З документації Docker:

docker exportне експортує вміст томів, пов’язаних із контейнером. Якщо том встановлений поверх існуючого каталогу в контейнері, docker exportбуде експортовано вміст базового каталогу, а не вміст тома. Зверніться до резервного копіювання, відновлення або міграції томів даних у посібнику користувача для прикладів експорту даних у томі.


вимкнення hq кластера ... та BTW для перенесення контейнера контейнер повинен працювати на ZFS / будь-якому підтримуваному сховищі сховища
asvignesh

6

Скористайтеся цим сценарієм: 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

1
Не працював у мене на AWS Linux (Centos). У кінцевому підсумку я застосував низькотехнологічний підхід використання докера для перевірки тома, а потім вручну скопіювавши це.
JasonPlutext

@JasonPlutext Може щось пов’язане із SELinux? У вас увімкнено SELinux?
Рікардо Бранко

1

Я спробував багато рішень для цього, і це те, що працювало для мене:

1.Задати / зберегти контейнер до нового зображення:

  1. ++ здійснити контейнер:
    # докер стоп
    # докер зробити CONTAINER_NAME
    # докер збереження - вихід IMAGE_NAME.tar IMAGE_NAME: TAG


ps: "Наш контейнер CONTAINER_NAME має змонтований том у '/ var / home'" (вам потрібно перевірити ваш контейнер, щоб вказати шлях до його тому: # docker перевірити 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.
До цього часу ми маємо зображення нашого conatainer 'IMAGE_NAME.tar' та його обсяг 'volume_backup.tar'.

Тепер ви можете відтворити той самий старий контейнер на новому хості.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.