LXD, la conteneurisation facile : les bases

Cet article est le 1er d’une longue lignée (enfin, j’espère) sur LXC et ses utilisations.

LXC, jamais entendu parler ?

LXC est un système de virtualisation, mais contrairement à une machine virtuelle, LXC simule l’environnement d’exécution, et non la machine complète.

LXD est une surcouche à LXC, développée par Canonical. LXD étant un daemon qui expose une API REST, permettant de contrôler LXC.

Dans ce 1er article, nous allons voir l’utilisation de LXC à la mano : on va créer nos conteneurs, les snapshoter, les supprimer, les dupliquer. Dans un futur proche, on fera les mêmes opérations, mais via ansible 😉

Ma machine hôte, mon porte-conteneurs, tourne sous Ubuntu 18.04 (la dernière ubuntu LTS à date) :

carmelo@pc-home-02:~$ cat /etc/issue
Ubuntu 18.04.2 LTS \n \l

Installation & configuration

Tout d’abord, j’installe LXD, via snap :

carmelo@pc-home-02:~$ sudo snap install lxd
[sudo] password for carmelo:
Fetch and check assertions for snap "lxd" (12181)
Mount snap "lxd" (12181)
Mount snap "lxd" (12181)
Mount snap "lxd" (12181)      
lxd 3.18 from Canonical✓ installed

Ensuite, je passe à l’initialisation :

carmelo@pc-home-02:~$ lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: no
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes
Name of the new storage pool [default=default]: default
Name of the storage backend to use (btrfs, dir, lvm) [default=btrfs]: btrfs
Create a new BTRFS pool? (yes/no) [default=yes]: yes
Would you like to use an existing block device? (yes/no) [default=no]: no
Size in GB of the new loop device (1GB minimum) [default=19GB]: 50GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: no
Would you like to create a new local network bridge? (yes/no) [default=yes]: yes
What should the new bridge be called? [default=lxdbr0]: lxdbr0
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]: yes
Address to bind LXD to (not including port) [default=all]: all
Port to bind LXD to [default=8443]: 8443
Trust password for new clients:
Again:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] yes
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: yes
config:
core.https_address: '[::]:8443'
core.trust_password: mot_de_passe_choisi
networks:
- config:
    ipv4.address: auto
    ipv6.address: none
description: ""
managed: false
name: lxdbr0
type: ""
storage_pools:
- config:
    size: 50GB
description: ""
name: default
driver: btrfs
profiles:
- config: {}
description: ""
devices:
    eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
    root:
    path: /
    pool: default
    type: disk
name: default
cluster: null

carmelo@pc-home-02:~$

Utilisation de base

Création d’un conteneur

Voilà, on peut passer à la création de notre 1er conteneur. Pour cet exemple, je choisis d’intialiser un conteneur sous Ubuntu 19.04 :

carmelo@pc-home-02:~$ lxc launch ubuntu:19.04 ubuntu1904-001
Creating ubuntu1904-001
Starting ubuntu1904-001
carmelo@pc-home-02:~$

Lister les conteneurs disponibles

Afin de lister les conteneurs disponibles sur le système, qu’ils soient lancés ou arrêtés, on utilise la commande "lxc list" :

carmelo@pc-home-02:~$ lxc list
+----------------+---------+-----------------------+------+------------+-----------+
|      NAME      |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+----------------+---------+-----------------------+------+------------+-----------+
| ubuntu1904-001 | RUNNING | 10.179.231.176 (eth0) |      | PERSISTENT | 0         |
+----------------+---------+-----------------------+------+------------+-----------+
carmelo@pc-home-02:~$

Démarrer / arrêter un conteneur

Pour ce faire, "lxc start" ou "lxc stop" sont là ;:

carmelo@pc-home-02:~$ lxc start ubuntu1904-001
carmelo@pc-home-02:~$ lxc stop ubuntu1904-001

Interagir avec le shell d’un conteneur

carmelo@pc-home-02:~$ lxc shell ubuntu1904-001
mesg: ttyname failed: No such device
root@ubuntu1904-001:~#

Pour sortir du shell, on tape soit exit, soit Ctrl+d.

Supprimer un conteneur :

lxc delete ubuntu1904-001

Si le conteneur est encore lancé, on peut forcer la suppression avec l’option -f :

lxc delete -f ubuntu1904-001

Créer un snapshot

LXC permet de créer un snapshot d’un conteneur, afin de garder un état du conteneur, et de pouvoir y revenir en cas de besoin :

carmelo@pc-home-02:~$ lxc snapshot ubuntu1904-001 mon1erSnapshot
carmelo@pc-home-02:~$

Rendre LXC accessible sur le réseau

lxc config set core.https_address [::]
lxc config set core.trust_password some-secret-string

Obtenir des infos sur un conteneur :

carmelo@pc-home-02:~$ lxc info ubuntu1904-001
Name: ubuntu1904-001
Remote: unix://
Architecture: x86_64
Created: 2019/10/12 11:58 UTC
Status: Running
Type: persistent
Profiles: default
Pid: 5407
Ips:
eth0:	inet	10.179.231.114	veth8J607L
eth0:	inet6	fe80::216:3eff:fec0:3662	veth8J607L
lo:	inet	127.0.0.1
lo:	inet6	::1
Resources:
Processes: 41
CPU usage:
    CPU usage (in seconds): 14
Memory usage:
    Memory (current): 334.40MB
    Memory (peak): 337.56MB
Network usage:
    eth0:
    Bytes received: 518.57kB
    Bytes sent: 13.64kB
    Packets received: 123
    Packets sent: 116
    lo:
    Bytes received: 1.62kB
    Bytes sent: 1.62kB
    Packets received: 19
    Packets sent: 19
Snapshots:
mon1erSnapshot (taken at 2019/10/12 11:58 UTC) (stateless)
carmelo@pc-home-02:~$

Voilà qui conclue cette découverte de LXC, au prochain épisode :