Copie contêineres lxd entre hosts

4

Instalei o lxd em dois hosts do Ubuntu que só podem se comunicar por meio de um servidor intermediário (no qual eu não tenho privilégios su). Eu criei um contêiner no meu localhost e agora deseja carregar o contêiner no servidor remoto.

Eu consultei o script de teste basic.sh no lxc / lxd repo para confirmar que estou usando a abordagem correta (descobri ao longo do caminho que eu estava entendendo mal imagens vs contêineres).

Eu criei um container test no meu localhost, instalei todos os itens necessários dentro dele, parei, publiquei e executei os seguintes comandos:

lxc image export test

Isso me dá um tarball 42cf01c53cb9e ... 83e3c48.tar.gz (abreviado aqui), conforme descrito na documentação (estou executando as versões lxc e lxd 2.0.0.beta3). Tentando importar essa imagem no mesmo host via

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

produz o erro:

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

O script basic.sh me leva a acreditar que eu estava seguindo a rota correta (exceto a descriç˜ao tar.gz x tar.xz). Consigo exportar imagens padrão e obter um arquivo .xz (quando eu as obtenho usando imagens lxd). Por exemplo,

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

produz um arquivo meta-ubuntu ... tar.xz e ubuntu ... tar.xz , que pode ser importado (em um servidor diferente) com

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

Como faço para copiar contêineres entre hosts?

Obrigado!

Edit: Eu investiguei mais e publiquei meu contêiner de teste, que cria uma imagem dele. Então eu recebo o arquivo .gz embora (sem os metadados) quando eu exporto. Se eu seqüestrar metadados da imagem original, então eu não posso começar o contêiner iniciado, embora a importação não trava mais em mim - eu obviamente não sei o que estou fazendo. Puxar a imagem para um segundo host usando a abordagem remote: do lxd (depois de adicionar o host usando a configuração lxd) não resulta na sua aparição na lista de imagens lxc .

    
por 0_0 23.02.2016 / 13:01

3 respostas

9

A versão posterior (não-beta) do lxd (v2.0) parece ter resolvido o meu problema. Os passos, que podem ser encontrados na excelente documentação aqui , são:

  1. Publique uma imagem (sem parar o contêiner) no host A;

    $ lxc publish --force container_name --alias image_name
    Container published with fingerprint: d2fd708361...a125d0d5885
    
  2. Exporte a imagem para um arquivo;

    $ lxc image export image_name 
    Output is in dd2fd708361...a125d0d5885.tar.gz
    
  3. Copie o arquivo para o host B e importe;

    $ lxc image import dd2fd708361...a125d0d5885.tar.gz --alias image_name
    Transferring image: 100%
    
  4. Inicie o container (da imagem) no host B;

    $ lxc launch image_name container_name
    Creating container_name
    Starting container_name
    

Em alguns casos, o comando publish pode levar a uma tar-ball xz dividida --- mas ambos os formatos são suportados . Simplesmente importe os componentes meta-data e rootfs com

    lxc image import <metadata tarball> <rootfs tarball> --alias image_name
    
por 13.08.2016 / 00:50
3

0_0 postou uma boa resposta, mas eu não posso comentar ainda, então vou postar sua resposta modificada.

Primeiro, lxc publish --force container_name --alias image_name irá parar o contêiner e reiniciá-lo, mas o OP não deseja que o contêiner seja parado.

Você deve fazer um instantâneo primeiro com lxc snapshot container_name snapshot_name

Depois, você pode publicar a imagem com lxc publish container_name/snapshot_name --alias image_name

Agora é só seguir o resto das instruções dele.

    
por 15.11.2016 / 06:05
0

Se você tem socat ou netcat ou gcc / python / perl / qualquer coisa que possa escutar no tcp, então você também pode ouvir no servidor intermediário e encaminhar a conexão para o outro host

    
por 05.09.2016 / 09:54