在主机之间复制lxd容器

我已经在两个只能通过中间服务器进行通信的ubuntu主机上安装了lxd(我没有su权限)。 我在我的本地主机上创build了一个容器,现在希望在远程服务器上加载容器。

我咨询了lxc / lxd仓库中的basic.shtesting脚本,以确认我使用的是正确的方法(我发现一路上我误解了图像vs容器)。

我在本地主机上创build了一个容器testing,在其中安装了所有必要的东西,停止了它,发布了它,并执行了以下命令:

lxc image export test 

这给了我一个tarball 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 

产生一个meta-ubuntu … tar.xzubuntu … tar.xz文件,可以导入(在不同的服务器上)

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

如何在主机之间复制容器?

谢谢!

编辑:我已经进一步调查,并已发布我的testing容器,它创build一个图像。 然后,当我导出时,我得到.gz文件(没有元数据)。 如果我从原始图像中劫持元数据,那么我无法启动容器,尽pipe导入不再导致我崩溃 – 我显然不知道自己在做什么。 使用lxd的remote:方法(使用lxd config添加主机之后)将图像拖到第二个主机上,不会导致它出现在lxc图像列表中

lxd(v2.0)的更新版本(非beta版本)似乎解决了我的问题。 可以在这里出色的文档中find的步骤是:

  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 tar-ball,但是这两种格式都是受支持的 。 只需导入元数据和rootfs组件

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

0_0发布了一个很好的答案,但我不允许评论,所以我只会发表他的答案修改。

首先closureslxc 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上侦听的东西,那么你也可以在中间服务器上侦听并把连接转发给其他主机