LXD容器进阶

LXD容器进阶

上次我们已经介绍了LXD的入门知识,有了这些入门知识,日常简单的需求是可以满足了。但是如果你有更多的需求,它依然可以为你提供更加高阶的功能,毕竟它一开始就是为Production Ready而设计和开发的。

复制/移动

lxc copy 用来复制一个已经存在的容器为一个新的容器,这样新容器除了主机名和IP地址之类之外将跟老的容器一模一样。这样管理员做好一份模块,可以快速的部署几十份一模一样的副本。

kaneg@zeroyi:~$ lxc copy foo bar
kaneg@zeroyi:~$ lxc start bar
kaneg@zeroyi:~$ lxc list 
+--------+---------+---------------------------+------+------------+-----------+
|  NAME  |  STATE  |              IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+--------+---------+---------------------------+------+------------+-----------+
| bar    | RUNNING | 10.19.6.29 (eth0)         |      | PERSISTENT | 0         |
+--------+---------+---------------------------+------+------------+-----------+
| foo    | RUNNING | 10.19.6.27 (eth0)         |      | PERSISTENT | 0         |
+--------+---------+---------------------------+------+------------+-----------+

lxc move 在同一个LXD主机上的作用是重命名

kaneg@zeroyi:~$ lxc list 
+--------+---------+---------------------------+------+------------+-----------+
|  NAME  |  STATE  |              IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+--------+---------+---------------------------+------+------------+-----------+
| bar    | RUNNING | 10.19.6.29 (eth0)         |      | PERSISTENT | 0         |
+--------+---------+---------------------------+------+------------+-----------+
| foo    | RUNNING | 10.19.6.27 (eth0)         |      | PERSISTENT | 0         |
+--------+---------+---------------------------+------+------------+-----------+
kaneg@zeroyi:~$ lxc move foo xyz
kaneg@zeroyi:~$ lxc list 
+--------+---------+---------------------------+------+------------+-----------+
|  NAME  |  STATE  |              IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+--------+---------+---------------------------+------+------------+-----------+
| bar    | RUNNING | 10.19.6.29 (eth0)         |      | PERSISTENT | 0         |
+--------+---------+---------------------------+------+------------+-----------+
| xyz    | RUNNING | 10.19.6.27 (eth0)         |      | PERSISTENT | 0         |
+--------+---------+---------------------------+------+------------+-----------+

快照/还原

虚拟机的快照是一个非常好用的功能,尤其是在做一些有危险性的操作时,有一个快照是多么幸福的事。比如你可以大胆的去尝试 rm -rf

  • 打快照:
kaneg@zeroyi:~$ lxc snapshot foo       #打一个快照,名字自动生成,比如snap0,snap1等
kaneg@zeroyi:~$ lxc snapshot foo xyz   #打一个名字为xyz的快照

kaneg@zeroyi:~$ lxc info foo
Name: foo
Remote: unix:/var/lib/lxd/unix.socket
Architecture: x86_64
Created: 2017/03/04 07:58 UTC
Status: Stopped
Type: persistent
Profiles: default
Snapshots:          #快照列表
  snap0 (taken at 2017/03/04 08:24 UTC) (stateless)
  xyz (taken at 2017/03/04 08:24 UTC) (stateless)
  • 还原快照
lxc restore foo xyz  #还原到刚才打的快照xyz

导入/导出

如果你做了一个LXD 容器模块,想要分享给其他人使用怎么办?最好的办法就是导出成一个镜像,然后别人就可以导入他们的LXD,然后就可以创建新的容器示例了。

  • 把容器制作成镜像
kaneg@zeroyi:~$ lxc publish foo --alias foo_image
Container published with fingerprint: b5d98d21af30bcd5cb533bb0e1b1ecbcebe9c56da2b8b62d4921e3248b477d85
kaneg@zeroyi:~$ lxc image list
+-----------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
|   ALIAS   | FINGERPRINT  | PUBLIC |                 DESCRIPTION                 |  ARCH  |   SIZE   |         UPLOAD DATE         |
+-----------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
| foo_image | b5d98d21af30 | no     |                                             | x86_64 | 225.83MB | Mar 4, 2017 at 8:44am (UTC) |
+-----------+--------------+--------+---------------------------------------------+--------+----------+-----------------------------+
  • 导出镜像
kaneg@zeroyi:~$ lxc image export foo_image foo_image
Output is in foo_image.tar.gz
  • 导入镜像
kaneg@zeroyi:~$ lxc image import foo_image.tar.gz 
Transferring image: 100%
Image imported with fingerprint: b5d98d21af30bcd5cb533bb0e1b1ecbcebe9c56da2b8b62d4921e3248b477d85

远程管理

之前这些命令都是本地操作,LXD还支持远程管理。从实现来说,LXD从一开始设计就是一个内核(LXD Daemon),对外提供REST API。而本地操作,则是用http over unix socket来调用REST API的。所以由于其天然就具备了网络管理的特性,其支持远程管理则是水到渠成的事,唯一要做的事则是做一下简单的设置。

  1. 打开远程访问端口, 并且设置访问密码

    kaneg@zeroyi:~$ lxc config set core.https_address 0.0.0.0
    kaneg@zeroyi:~$ lxc config set core.trust_password <Password>
    

    之后你就会发现本地多了一个监听端口8443

  2. 添加远程服务器

    kaneg@zeroyi:~$ lxc remote add foo https://localhost:8443
    Certificate fingerprint: 9704f6a2cea7d1b3ca2d23g1fc26db74bf900ed72ab77244736d7222443e1c87
    ok (y/n)? y
    Admin password for foo: 
    Client certificate stored at server:  foo
  3. 查看远程服务器

    kaneg@zeroyi:~$ lxc remote list
    +-----------------+------------------------------------------+---------------+--------+--------+
    |      NAME       |                   URL                    |   PROTOCOL    | PUBLIC | STATIC |
    +-----------------+------------------------------------------+---------------+--------+--------+
    | foo             | https://localhost:8443                   | lxd           | NO     | NO     |
  4. 控制远程服务器 因为LXD服务从一开始就是按照远程服务来设计的,所以操作远程服务器和本地没有太大区别,仅仅需要指明远程服务器的名字,即<服务器>:<容器>。 本地服务器其实也是有个名字的,即local, 只是因为本地服务器已经被设置为默认,所以不需要添加服务器前缀。

    kaneg@zeroyi:~$ lxc list foo:
    +--------+---------+--------------------------------+------+------------+-----------+
    |  NAME  |  STATE  |              IPV4              | IPV6 |    TYPE    | SNAPSHOTS |
    +--------+---------+--------------------------------+------+------------+-----------+
    | bar    | STOPPED |                                |      | PERSISTENT | 2         |
    +--------+---------+--------------------------------+------+------------+-----------+

    有了远程服务器设置,之前的copy, move等命令都可以跨服务器来执行,这样就自然可以实现容器的迁移功能。