在主机之间复制 lxd 容器

0_0*_*0_0 6 ubuntu containers lxc

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

我查阅了lxc/lxd 存储库中的basic.sh测试脚本以确认我使用的是正确的方法(我在此过程中发现我误解了图像与容器)。

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

lxc image export test
Run Code Online (Sandbox Code Playgroud)

这给了我一个 tarball 42cf01c53cb9e...83e3c48.tar.gz(在此处缩短),如文档中所述(我正在运行 lxc 和 lxd 版本 2.0.0.beta3)。尝试通过以下方式在同一主机上导入该图像

lxc image import 42cf01c53cb9e...83e3c48.tar.gz --alias testimage
Run Code Online (Sandbox Code Playgroud)

产生错误:

exit status 2 (tar: metadata.yaml: Not found in archive)
Run Code Online (Sandbox Code Playgroud)

basic.sh脚本使我相信,我是下虽然正确的路由(除了将tar.gz VS tar.xz descrepancY)。我能够导出标准图像并获取 .xz 文件(当我使用 lxd-images 获取它们时)。例如,

lxd-images import ubuntu --alias ubuntu
lxc image export ubuntu
Run Code Online (Sandbox Code Playgroud)

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

lxc image import meta...tar.xz rootfs ubuntu...tar.xz --alias imported_ubuntu
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

编辑:我进一步调查并发布了我的测试容器,它创建了它的图像。然后我在导出时得到了 .gz 文件(没有元数据)。如果我从原始图像中劫持元数据,那么我将无法启动容器,尽管导入不再对我崩溃——我显然不知道我在做什么。使用 lxd 的remote:方法(在使用 lxd 配置添加主机后)将图像拉到第二台主机上不会导致它出现在lxc 图像列表中

0_0*_*0_0 15

lxd (v2.0) 的后续版本(非测试版)似乎解决了我的问题。可以在此处的优秀文档中找到的步骤是:

  1. 在主机 A 上发布镜像(不停止容器);

    $ lxc publish --force container_name --alias image_name
    Container published with fingerprint: d2fd708361...a125d0d5885
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将图像导出到文件;

    $ lxc image export image_name 
    Output is in dd2fd708361...a125d0d5885.tar.gz
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将文件复制到主机B,并导入;

    $ lxc image import dd2fd708361...a125d0d5885.tar.gz --alias image_name
    Transferring image: 100%
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在主机 B 上启动容器(从镜像);

    $ lxc launch image_name container_name
    Creating container_name
    Starting container_name
    
    Run Code Online (Sandbox Code Playgroud)

在某些情况下,发布命令可能会导致 xz tar-ball 分裂 --- 但两种格式都受支持。只需使用以下命令导入元数据和 rootfs 组件

    lxc image import <metadata tarball> <rootfs tarball> --alias image_name
Run Code Online (Sandbox Code Playgroud)