LXC-Images erstellen, exportieren und importieren mit LXD

Datum

Wenn man LXCs sichern möchte, kann man selbstverständlich Snapshots erstellen und diese bei Bedarf wieder auf dem gleichen oder einem anderen LXC-Host einspielen. Man kann aus diesem Snapshot auch ein Image erstellen, welches die Vorlage für weitere Container sein kann. Genauso kann man dieses eigene Container-Image auch exportieren und als .tar.gz auf der Festplatte speichern.
Das ist besonders nützlich, wenn man ein Backup seiner Container haben möchte, zum sichern aber „nur“ einen Storage-Server hat und keinen anderen LXC-Host.

Image erstellen

Ich habe folgende Container momentan zur Auswahl:

$ lxc list
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
|    NAME    | STATUS  |         IPV4         |                     IPV6                     |    TYP     | SCHNAPPSCHÜSSE |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| DB01       | RUNNING | 10.140.46.180 (eth0) | fd37:9db1:6128:ad3:216:3eff:fe5d:28cd (eth0) | PERSISTENT | 1               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| ubuntu1804 | STOPPED |                      |                                              | PERSISTENT | 2               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| web01      | RUNNING | 10.140.46.148 (eth0) | fd37:9db1:6128:ad3:216:3eff:fec5:abea (eth0) | PERSISTENT | 0               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+

bei web01 handelt es sich um eine angepasste Version vom Container ubuntu1804 und läuft exakt so wie ich es mir wünsche und deshalb möchte ich diesen auch sichern und auch ggf. aus dieser Sicherung in einen LXC-Host meiner Wahl wieder importieren können.

Der erste Schritt ist hierbei ein Snapshot, welchen wir von dem entsprechenden Container (web01) erstellen:
$ lxc snapshot web01 snap01

Dieser Snapshot hat den Namen snap01 bekommen.

$ lxc info web01
Name: web01
Remote: unix://
Architektur: x86_64
...
Schnappschüsse:
  snap01 (taken at 2018/04/10 15:18 UTC) (stateless)

Um aus dem eben gemachten Snapshot ein Image zu erstellen, verwenden wir den Befehl publish:

$ lxc publish web01/snap01 --alias web01Image
Container published with fingerprint: cc902c84f9539e481350797e6426db6f964866e54993bc41e6784458001a8663

Das erstellte Image findet sich nun auch in unserer lokalen Image-Liste:

$ lxc image list
+------------+---------------+--------+-------------------------------------------+--------+----------+------------------------------+
|   ALIAS    | FINGERABDRUCK | PUBLIC |               BESCHREIBUNG                |  ARCH  | GRÖßE  |        HOCHLADEDATUM         |
+------------+---------------+--------+-------------------------------------------+--------+----------+------------------------------+
| web01Image | cc902c84f953  | Nein   |                                           | x86_64 | 402.22MB | Apr 10, 2018 at 3:23pm (UTC) |
+------------+---------------+--------+-------------------------------------------+--------+----------+------------------------------+
|            | 845b778cdc61  | Nein   | ubuntu 18.04 LTS amd64 (daily) (20180404) | x86_64 | 173.13MB | Apr 7, 2018 at 10:38pm (UTC) |
+------------+---------------+--------+-------------------------------------------+--------+----------+------------------------------+

Nun kann ich das vom Container web01 erstellte Image dazu verwenden weitere Container mit genau der gleichen Konfiguration zu erstellen:

$ lxc launch web01Image web02
web02 wird erstellt
web02 wird gestartet
$ lxc list
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
|    NAME    | STATUS  |         IPV4         |                     IPV6                     |    TYP     | SCHNAPPSCHÜSSE |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| DB01       | RUNNING | 10.140.46.180 (eth0) | fd37:9db1:6128:ad3:216:3eff:fe5d:28cd (eth0) | PERSISTENT | 1               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| ubuntu1804 | STOPPED |                      |                                              | PERSISTENT | 2               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| web01      | RUNNING | 10.140.46.148 (eth0) | fd37:9db1:6128:ad3:216:3eff:fec5:abea (eth0) | PERSISTENT | 1               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+
| web02      | RUNNING | 10.140.46.112 (eth0) | fd37:9db1:6128:ad3:216:3eff:fea6:761c (eth0) | PERSISTENT | 0               |
+------------+---------+----------------------+----------------------------------------------+------------+-----------------+

Image exportieren

Man kann ein LXC-Image als .tar.gz exportieren, die allgemeine Syntax lautet wie folgt:
lxc image export <Imagename> <Zielverzeichnis/archivname>
beim Namen des Archives braucht keine Endung mitangeben werden.

$ lxc image export web01Image /home/rasputin/web01Image
Image exported successfully!

Nun finde ich im Zielverzeichnis ein entsprechendes Archiv:

$ ls -lh *.gz
-rw-rw-r-- 1 rasputin rasputin 403M Apr 10 17:34 web01Image.tar.gz

Dieses Archiv kann man nun bequem auf einem externen Server sichern oder ähnliches.

Image importieren

Nun können wir das das .tar.gz -Archiv auf einem anderen LXC-Host wieder importieren und zwar genauso einfach wie es exportiert wurde.

$ lxc image list
+-------+---------------+--------+--------------+------+---------+---------------+
| ALIAS | FINGERABDRUCK | PUBLIC | BESCHREIBUNG | ARCH | GRÖßE | HOCHLADEDATUM |
+-------+---------------+--------+--------------+------+---------+---------------+
$ lxc image import web01Image.tar.gz --alias webImage
Image imported with fingerprint: cc902c84f9539e481350797e6426db6f964866e54993bc41e6784458001a8663
$ lxc image list
+----------+---------------+--------+-------------------------------------------------+--------+----------+------------------------------+
|  ALIAS   | FINGERABDRUCK | PUBLIC |                  BESCHREIBUNG                   |  ARCH  | GRÖßE  |        HOCHLADEDATUM         |
+----------+---------------+--------+-------------------------------------------------+--------+----------+------------------------------+
| webImage | cc902c84f953  | Nein   | ubuntu bionic x86_64 (default) (20180408_03:49) | x86_64 | 402.22MB | Apr 10, 2018 at 3:43pm (UTC) |
+----------+---------------+--------+-------------------------------------------------+--------+----------+------------------------------+

Nun kann man aus dem Image wieder seine Container erstellen:

$ lxc list
+------+--------+------+------+-----+-----------------+
| NAME | STATUS | IPV4 | IPV6 | TYP | SCHNAPPSCHÜSSE |
+------+--------+------+------+-----+-----------------+
$ lxc launch webImage web02
web02 wird erstellt
web02 wird gestartet
$ lxc list
+-------+---------+-----------------------+-----------------------------------------------+------------+-----------------+
| NAME  | STATUS  |         IPV4          |                     IPV6                      |    TYP     | SCHNAPPSCHÜSSE |
+-------+---------+-----------------------+-----------------------------------------------+------------+-----------------+
| web02 | RUNNING | 10.236.212.117 (eth0) | fd6f:85cd:6e64:efdb:216:3eff:fef8:13c1 (eth0) | PERSISTENT | 0               |
+-------+---------+-----------------------+-----------------------------------------------+------------+-----------------+

Autor
Kategorien Linux, LXC/LXD

PRTG Map