LXD est une interface permettant de manipuler facilement les conteneurs LXC (LinuX Conteners), disponibles sur les distributions Ubuntu notamment.
Mis en place par Canonical, LXD possède un site Internet officiel avec de nombreuses ressources : https://linuxcontainers.org/
Au menu de cet article :
- Préparation d'un serveur LXD
- Création et gestion des conteneurs
- Gestion du réseau
- Echange de données entre le serveur et les conteneurs
- Exportation et importation de conteneurs
- Quelques commandes utiles en vrac
Préparation d'un serveur LXD
Installation et initialisation
La première étape est d'installer le paquet lxd
sur votre serveur : apt-get install lxd
Une fois le paquet installé, le serveur doit être configuré avec la commande lxd init
qui demande quelques informations. Voici un exemple de réponse pour une configuration standard d'un serveur LXD :
Information | Valeur |
---|---|
Utilisation du clustering | Non |
Configuration d'un nouveau pool de stockage | Oui |
Nom du pool de stockage | lxd1 |
Système de stockage | btrfs |
Création d'un nouveau pool BTRFS | Oui |
Utilisation d'un bloc existant | Non |
Taille du dispositif | 15 Go |
Connexion à un serveur MAAS | Non |
Création d'une carte réseau en pont | Oui |
Nom de la carte réseau | lxdbr0 |
Adresse IPv4 de la carte réseau | 192.168.240.1/24 |
Autorisation du trafic en NAT | Oui |
Adresse IPv6 | Non |
Autorisation de LXD à travers le réseau | Non |
Mise à jour automatique des images en cache | Oui |
Affichage du fichier YAML pour lxd init | Non |
Avec cette configuration, le serveur LXD stockera les conteneurs au format BTRFS sur la partition principale du serveur, avec une limite de 15 Go. Les conteneurs pourront communiquer avec le réseau extérieur via une carte réseau en pont nommée lxdbr0, tous les conteneurs et la serveur physique se trouveront dans le réseau 192.168.240.0/24 (la carte du serveur aura pour adresse 192.168.240.1/24).
Configuration du proxy sur LXD
Deux manipulations sont nécessaire afin que votre serveur LXD puis vos conteneurs puissent accéder à Internet si votre serveur accède à Internet via un proxy.
Valorisation des variables système http_proxy
et https_proxy
avec les commandes suivantes :
export http_proxy="http://identifiant:mdp@ip:port/"
export https_proxy="http://identifiant:mdp@ip:port/"
Configuration du proxy dans le serveur LXD avec les commandes suivantes (après avoir installé LXD sur votre serveur évidemment) :
lxc config set core.proxy_http http://identifiant:mdp@ip:port
lxc config set core.proxy_https http://identifiant:mdp@ip:port
Création et gestion des conteneurs
La commande lxc
La commande lxc
(et non lxd
) permet de gérer les conteneur. Voici ces principales options :
Option | Fonction |
---|---|
launch |
Création et lancement d'un conteneur |
init |
Création d'un conteneur |
start |
Démarrage d'un conteneur |
stop |
Arrêt d'un conteneur |
list |
Liste des conteneurs |
exec |
Exécution d'une commande dans un conteneur |
config |
Configuration du serveur et des conteneurs |
file |
Gestion des fichiers des conteneurs |
network |
Gestion du réseau des conteneurs |
publish |
Gestion de l'image d'un conteneur |
image |
Gestion des images de conteneurs |
La liste complète des options est disponible en tapant la commande lxc help
sur votre serveur LXD.
Les images
Les conteneurs sont créés à partir d'images disponibles sur trois serveurs en ligne : le serveur ubuntu
(images des versions stables d'Ubuntu), le serveur ubuntu-daily
(images des dernières versions d'Ubuntu) et le serveur images
(images de diverses distributions Linux).
La liste des images disponibles sur un de ces trois serveurs est accessible avec la commande lxc image list serveur:
(en remplaçant serveur
par le nom du serveur).
Lorsque vous créez un conteneur à partir d'une image en ligne, elle est téléchargée sur le serveur local et stockée localement. Vous pouvez consulter la liste des images locales avec la commande lxc image list local:.
Vous pouvez ensuite supprimer une image locale avec la commande lxc image delete aliasimage
(si l'image n'a pas d'alias, utilisez le fingerprint).
Création d'un conteneur
Un conteneur se crée avec la commande lxc init serveur:systeme conteneur
avec :
serveur
: nom du serveur de l'image sur laquelle baser le conteneur ;systeme
: version du système d'exploitation (possibilité d'ajouter la version à la suite en la séparant du système avec un/
) ;conteneur
: nom que vous souhaitez donner à votre conteneur. Si vous n'en précisez aucun, un nom aléatoire sera donné au conteneur.
Exemples de création de conteneurs:
- Ubuntu 18.04 :
lxc init ubuntu:18.04 srv-ubuntu
- Debian 9 (Stretch) :
lxc init images:debian/stretch mondebian
- Alpine 3.10 64 bits :
lxc init images:alpine/3.10/amd64 servalp
Deux points à noter :
- Lors de la première création d'un conteneur à partir d'une image, l'image est téléchargée d'Internet avant la création du conteneur, ce qui peut prendre du temps. Si vous créez un deuxième conteneur à partir de la même image, la création sera quasiment instantanée puisque l'image sera stockée sur le serveur LXD.
- La commande
lxc
init crée le conteneur ne le lance pas. Si vous souhaitez créer le conteneur et le lancer dans la foulée, utilisez la commandelxc launch
.
Manipulation d'un conteneur
- Démarrage d'un conteneur :
lxc start conteneur
- Arrêt d'un conteneur :
lxc stop conteneur
- Suppression d'un conteneur :
lxc delete conteneur
Exécution d'une commande dans un conteneur
La commande lxc exec
permet d'exécuter une commande à l'intérieur d'un conteneur avec la syntaxe suivante : lxc exec conteneur commande
. Par exemple, pour mettre à jour les dépôts sur un conteneur nommé srv-web : lxc exec srv-web apt-get update
La commande lxc exec
permet également d'accéder facilement au shell d'un conteneur en lançant le shell (via le raccourci /bin/bash
) du conteneur : lxc exec conteneur /bin/bash
. Vous pouvez ensuite executer directement les commandes dans le conteneur sans passer par lxc exec
.
Gestion du réseau
Mode bridged
Mode par défaut, les conteneurs communiquent vers l'extérieur via la carte pont créée lors de l'initialisation de LXD. Un réseau IP particulier est créé entre les conteneur et la carte pont du serveur, la machine hôte fait office de routeur avec que le réseau des conteneurs puissent communiquer avec le réseau externe au serveur.
La carte réseau des conteurs ont une configuration IP attribuée par LXD en DHCP. Vous pouvez néanmoins attrivuer une configuration IP particulière à vos conteneurs avec les commandes suivantes :
- Attachement de la carte réseau du conteneur au pont :
lxc network attach pont conteneur interfaceconteneur
- Définition de l'adresse IP :
lxc config device set conteneur interfaceconteneur ipv4.address X.X.X.X
Un redémarrage du conteneur ou une relance de Netplan dans le conteneur est parfois nécessaire pour que l'adresse IP soit attribuée correctement à la carte réseau du conteneur.
Exemple, pour attribuer l’adresse 192.168.1.1 à l’interface eth0 du conteneur srv-test, qui sera attachée à la carte pont lxdbr0 :
lxc network attach lxdbr0 srv-test eth0
lxc config device set srv-test eth0 ipv4.address 192.168.1.1
Mode macvlan
Le mode macvlan permet à un conteneur d'accéder directement au réseau externe au serveur LXD, en attribuant une deuxième adresse MAC à la carte réseau du serveur LXD permettant d'identifier les trames du conteneur.
Manipulation préalable : le mode promiscuité (permettant à une carte réseau d'accepter des trames qui ne lui sont pas destinées) doit être activé sur la carte réseau du serveur LXD. Ce mode s'active avec la commande ip link set enp0s3 promisc on
(à faire une seule fois pour l'ensemble des conteneurs mais à chaque redémarrage du serveur).
Limite du mode macvlan : le conteneur pourra communiquer avec toutes les machines du réseau extérieur à l'exception du serveur LXD.
La solution la plus simple pour utiliser macvlan est la création d'un profil basé sur le profil par défaut, que l'on attribuera aux conteneurs devant accéder directement au réseau extérieur :
- Création d'un profil nommé macvlan basé su le profil par défaut:
lxc profile copy default macvlan
- Edition du profil macvlan :
lxc profile edit macvlan
puis :- Ajouter la ligne
nictype: macvlan
après l'instruction name ; - Ajouter à la suite la ligne
parent: enp0s3
(nom de la carte réseau du serveur LXD par lequel passeront les communications des conteneurs) - Supprimer la ligne avec l'instruction
network
.
- Ajouter la ligne
- Vérification de la prise en compte de la modification :
lxc profile show macvlan
- Attribution du profil à un conteneur :
lxc profile apply conteneur macvlan
- Vérification de la prise en compte du profil pour le conteneur :
lxc info conteneur
Vous pouvez ensuite configurer la carte réseau de votre conteneur directement dans le conteneur.
Afin d'éviter que votre conteneur prenne une adresse IPv6 parasite, ajoutez la ligne net.ipv6.conf.all.disable_ipv6=1
dans le fichier /etc/sysctl.conf
du conteneur.
Echange de données entre serveur et conteneurs
Transfert des fichiers
- Du serveur LXD à un conteneur :
lxc file push fichier conteneur/repertoire/
- D'un conteneur au serveur LXD :
lxc file pull conteneur/repertoire/fichier repertoirehote
Répertoire partagé
lxc config device add conteneur nom disk source=/rep1/ path=/rep2
source
: répertoire du serveur LXDpath
: répertoire du conteneur
Exportation et importation de conteneur
Les conteneurs peuvent s'exporter et s'importer sous forme d'image.
Création de l'image d'un conteneur
- Création de l'image d'un conteneur avec l'alias nomimage :
lxc publish conteneur --alias=nomimage
- Exportation de l'image sous forme de fichier compressé :
lxc image export nomimage
L'image est ainsi exportée dans un fichier compressé avec un nom très long, en hexadécimal, dans votre répertoire de travail.
Importation d'une image d'un conteneur et création du conteneur à partir de l'image
- Importation de l'image sous le nom nomimage :
lxc image import xxxxxx.tar.gz --alias=nomimage
- Création du conteneur à partir de l'image :
lxc init local:nomimage conteneur
Quelques commandes utiles en vrac
lxc storage list
: liste des espaces de stockagelxc storage info lxd0
: informations concernant l'espace de stockage lxd0lxc config set conteneur boot.autostart true
: démarrage automatique du conteneur