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 :
- avoir ses conteneurs dans son LAN
- gérer ses conteneurs via ansible