Я установил 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), похоже, решила мою проблему. Шаги, которые можно найти в отличной документации Вот, являются:
Опубликовать изображение (не останавливая контейнер) на хосте A;
$ lxc publish --force container_name --alias image_name
Container published with fingerprint: d2fd708361...a125d0d5885
Экспорт изображения в файл;
$ lxc image export image_name
Output is in dd2fd708361...a125d0d5885.tar.gz
Скопируйте файл на хост B и импортируйте;
$ lxc image import dd2fd708361...a125d0d5885.tar.gz --alias image_name
Transferring image: 100%
Запустить контейнер (с изображения) на хосте 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, вы также можете прослушивать промежуточный сервер и перенаправлять соединение на другой хост