我已经在两个只能通过中间服务器进行通信的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.xz和ubuntu … 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的步骤是:
在主机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 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上侦听的东西,那么你也可以在中间服务器上侦听并把连接转发给其他主机