我在两台 ubuntu 主机上安装了 lxd,它们只能通过中间服务器(我没有 su 权限)进行通信。我在本地主机上创建了一个容器,现在希望在远程服务器上加载该容器。
我咨询了基本操作我在 lxc/lxd repo 中测试了脚本,以确认我使用了正确的方法(在此过程中我发现我误解了图像和容器)。
我已经创建了一个容器测试在我的本地主机上,安装了所有必要的组件,停止它,发布它,并执行以下命令:
lxc image export test
这给了我一个 tarball42cf01c53cb9e...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)
这基本操作脚本让我相信我遵循了正确的路线(除了 tar.gz 与 tar.xz 的差异)。我可以导出标准图像并获取 .xz 文件(当我使用 lxd-images 获取它们时)。例如,
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
如何在主机之间复制容器?
谢谢!
编辑:我进行了进一步调查,并发布了我的测试容器,它创建了它的镜像。然后,当我导出它时,我得到了 .gz 文件(没有元数据)。如果我从原始图像中劫持元数据,那么我无法启动容器,尽管导入不再崩溃 --- 我显然不知道我在做什么。使用 lxd 将图像拉到第二台主机偏僻的:方法(使用 lxd 配置添加主机后)不会导致它出现在lxc 图像列表。
答案1
后来的 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 tar-ball 分裂 --- 但两种格式都是支持的只需使用以下命令导入元数据和 rootfs 组件
lxc image import <metadata tarball> <rootfs tarball> --alias image_name
答案2
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
现在只需按照他的其余指示进行操作即可。
答案3
如果你有 socat 或 netcat 或 gcc / python / perl / 任何可以监听 tcp 的东西,那么你也可以监听中间服务器并将连接转发到另一台主机