Назад | Перейти на главную страницу

Копирование lxd-контейнеров между хостами

Я установил lxd на два хоста ubuntu, которые могут общаться только через промежуточный сервер (на котором у меня нет прав su). Я создал контейнер на своем локальном хосте и теперь хочу загрузить его на удаленный сервер.

Я проконсультировался с basic.sh тестовый скрипт в репозитории lxc / lxd, чтобы подтвердить, что я использую правильный подход (по пути я обнаружил, что неправильно понимаю изображения и контейнеры).

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

lxc image export test

Это дает мне архив 42cf01c53cb9e ... 83e3c48.tar.gz (здесь сокращено), как описано в документации (я использую lxc и lxd версий 2.0.0.beta3). Попытка импортировать это изображение на тот же хост через

lxc image import 42cf01c53cb9e...83e3c48.tar.gz --alias testimage

дает ошибку:

exit status 2 (tar: metadata.yaml: Not found in archive)

В basic.sh Скрипт заставляет меня поверить, что я следовал правильному маршруту (за исключением tar.gz vs tar.xz descrepancY). Я могу экспортировать стандартные изображения и получить файл .xz (когда я получаю их с помощью lxd-изображений). Например,

lxd-images import ubuntu --alias ubuntu
lxc image export ubuntu

производит мета-убунту ... tar.xz и убунту ... tar.xz файл, который можно импортировать (на другой сервер) с

lxc image import meta...tar.xz rootfs ubuntu...tar.xz --alias imported_ubuntu

Как копировать контейнеры между хостами?

Спасибо!

Изменить: я исследовал дальше и опубликовал свой тестовый контейнер, который создает его изображение. Затем я получаю файл .gz (без метаданных) при его экспорте. Если я захватываю метаданные из исходного изображения, я не могу запустить контейнер, хотя импорт больше не вызывает сбоев - я, очевидно, не знаю, что делаю. Передача изображения на второй хост с помощью lxd удаленный: подход (после добавления хоста с использованием конфигурации lxd) не приводит к его появлению в Список изображений lxc.

Более поздняя версия (не бета) lxd (v2.0), похоже, решила мою проблему. Шаги, которые можно найти в отличной документации Вот, являются:

  1. Опубликовать изображение (не останавливая контейнер) на хосте A;

    $ lxc publish --force container_name --alias image_name
    Container published with fingerprint: d2fd708361...a125d0d5885
    
  2. Экспорт изображения в файл;

    $ lxc image export image_name 
    Output is in dd2fd708361...a125d0d5885.tar.gz
    
  3. Скопируйте файл на хост B и импортируйте;

    $ lxc image import dd2fd708361...a125d0d5885.tar.gz --alias image_name
    Transferring image: 100%
    
  4. Запустить контейнер (с изображения) на хосте B;

    $ lxc launch image_name container_name
    Creating container_name
    Starting container_name
    

В некоторых случаях команда публикации может привести к разделению архива xz --- но оба формата поддержанный. Просто импортируйте метаданные и компоненты rootfs с помощью

    lxc image import <metadata tarball> <rootfs tarball> --alias image_name

0_0 опубликовал хороший ответ, но мне пока не разрешено комментировать, поэтому я просто отправлю его ответ измененным.

Прежде всего lxc publish --force container_name --alias image_name остановит контейнер и перезапустит его, но OP не хотел останавливать контейнер.

Сначала вы должны сделать снимок с помощью lxc snapshot container_name snapshot_name

Затем вы можете опубликовать изображение с помощью lxc publish container_name/snapshot_name --alias image_name

Теперь просто следуйте остальным его инструкциям.

Если у вас есть socat или netcat или gcc / python / perl / что-нибудь, что может прослушивать tcp, вы также можете прослушивать промежуточный сервер и перенаправлять соединение на другой хост