Introduction
LXC est une technologie de virtualisation légère qui permet d'exécuter des conteneurs Linux isolés sur un système hôte. Les conteneurs LXC partagent le noyau du système hôte, ce qui les rend plus légers que les machines virtuelles traditionnelles.
Installation de LXC
Tout d'abord, on doit s'assurer que le noyau du système prend en charge les containers LXC. On peut vérifier cela en exécutant la commande suivante en tant que sudo :
sudo apt-get update
content_copy
sudo apt install lxc-utils
content_copy
Ensuite, on peut installer LXC en utilisant le gestionnaire de paquets de notre distribution Linux. Par exemple, si on utilise Ubuntu, on peut exécuter la commande suivante pour installer LXC :
sudo apt install lxc
content_copy
Vérification de l'installation
Une fois LXC installé, on peut vérifier sa version avec la commande suivante :
sudo lxc --version
content_copy
On doit également vérifier le status du service LXC :
sudo systemctl status lxc.service
content_copy
Si le service n'est pas activé, on peut l'activer avec la commande suivante :
sudo systemctl start lxc.service
content_copy
Pour s'assurer que le service LXC démarre automatiquement au démarrage du système :
sudo systemctl enable lxc.service
content_copy
Lorsqu'on installe LXC, il crée un pont réseau (bridge) appelé généralement
lxcbr0 pour gérer les communications réseau entre les conteneurs et l'hôte.
Ce pont réseau est configuré avec une plage d'adresses IP spécifique.
Nous verrons plus de détails lors de la création d'un conteneur. Partie création d'un conteneur
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:fd:32:2d brd ff:ff:ff:ff:ff:ff
inet 10.11.6.2/28 brd 10.11.6.15 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fefd:322d/64 scope link
valid_lft forever preferred_lft forever
3: lxcbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.1/24 brd 10.0.3.255 scope global lxcbr0
valid_lft forever preferred_lft forever
3- Commandes de bases de LXC
Nous allons voir certaines commandes les plus utilisées avec LXC
Création d'un conteneur
sudo lxc-create -n ctn01 -t download
content_copy
Arrêter le service LXC
sudo systemctl stop lxc.service
content_copy
Lancer le service LXC
sudo systemctl start lxc.service
content_copy
Relancer le service LXC
sudo systemctl restart lxc.service
content_copy
Lancer LXC dès le démarrage du système
sudo systemctl enable lxc.service
content_copy
Vérifier le status LXC
sudo systemctl status lxc.service
content_copy
Installer les templates LXC
Les templates LXC sont conçus pour simplifier la création de conteneurs en fournissant des configurations de base pré-configurées.
sudo apt install lxc-templates
content_copy
Lister les templates LXC sur la machine
toto@srv:~$ ls /usr/share/lxc/templates/
lxc-alpine lxc-archlinux lxc-centos lxc-debian lxc-fedora
lxc-gentoo lxc-oci lxc-opensuse lxc-plamo lxc-sabayon
lxc-sparclinux lxc-ubuntu lxc-voidlinux lxc-download
lxc-altlinux lxc-busybox lxc-cirros lxc-fedora-legacy lxc-local
lxc-openmandriva lxc-oracle lxc-pld lxc-slackware lxc-sshd lxc-ubuntu-cloud
Lister tous les conteneurs installés
sudo lxc-ls --fancy
content_copy
Créer un conteneur rapide
Cette commande peut parfois ne pas fonctionner sur certaines distributions.
toto@srv:~$ sudo lxc-create -t ubuntu -n con_ubuntu
Checking cache download in /var/cache/lxc/focal/rootfs-amd64 ...
Copy /var/cache/lxc/focal/rootfs-amd64 to /var/lib/lxc/con_ubuntu/rootfs ...
.
.
Current default time zone: 'Etc/UTC'
Local time is now: Fri Feb 2 10:35:14 UTC 2024.
Universal Time is now: Fri Feb 2 10:35:14 UTC 2024.
##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##
Configuration réseau 1/3:
Par défaut, LXC configure chaque conteneur pour qu'il utilise un réseau bridge (pont réseau) virtuel, lxcbr0 dans notre cas. Ce bridge agit comme un commutateur virtuel auquel les conteneurs peuvent se connecter pour accéder au réseau extérieur et communiquer entre eux. Le bridge lxcbr0 est configuré avec son propre sous-réseau, permettant à chaque conteneur de disposer de sa propre adresse IP dans ce sous-réseau.
Lancer un conteneur
sudo lxc-start -n <nom_conteneur>
content_copy
Configuration réseau sur l'hôte (Création de l'interface veth) 2/3:
toto@srv:~$ ip a
.
.
5: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.1/24 brd 10.0.3.255 scope global lxcbr0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe00:0/64 scope link
valid_lft forever preferred_lft forever
9: vethXtdAM3@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxcbr0 state UP group default qlen 1000
link/ether fe:5e:b7:a3:53:4b brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::fc5e:b7ff:fea3:534b/64 scope link
valid_lft forever preferred_lft forever
Lors du démarrage du conteneur avec sudo lxc-start con_ubuntu, LXC crée une paire d'interfaces virtuelles Ethernet (veth). Une extrémité de cette paire, vethXtdAM3 dans notre cas, est attachée au bridge lxcbr0 sur l'hôte, et l'autre extrémité est placée à l'intérieur du conteneur. Cette paire d'interfaces permet la communication réseau entre l'hôte et le conteneur, ainsi qu'entre les conteneurs eux-mêmes si plusieurs sont présents et connectés au même bridge.
Configuration réseau dans le conteneur 3/3:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:83:9d:bf brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.3.193/24 brd 10.0.3.255 scope global dynamic eth0
valid_lft 2256sec preferred_lft 2256sec
inet6 fe80::216:3eff:fe83:9dbf/64 scope link
valid_lft forever preferred_lft forever
Arrêter un conteneur
sudo lxc-stop -n <nom_conteneur>
content_copy
Supprimer un conteneur
sudo lxc-destroy -n <nom_conteneur>
content_copy
Accéder au conteneur
sudo lxc-attach -n <nom_conteneur>
content_copy
Vérifier les informations du conteneur
Cette commande permet de vérifier des informations détaillées sur le conteneur, notamment son état, ses configurations réseau et son utilisation des ressources.
toto@srv:~$ sudo lxc-info -n con_ubuntu
Name: con_ubuntu
State: RUNNING
PID: 36062
IP: 10.0.3.193
CPU use: 1.03 seconds
BlkIO use: 61.05 MiB
Memory use: 44.26 MiB
KMem use: 6.78 MiB
Link: vethXtdAM3
TX bytes: 2.96 KiB
RX bytes: 5.36 KiB
Total bytes: 8.32 KiB
Ports ouverts et services en écoute
root@conubuntu2:/# ss -tulpn
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=60,fd=12))
udp UNCONN 0 0 10.0.3.216%eth0:68 0.0.0.0:* users:(("systemd-network",pid=45,fd=19))
tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=60,fd=13))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=64,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=64,fd=4))
Changer d'utilisateur dans le conteneur
root@conubuntu2:/# su - ubuntu
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@conubuntu2:~$
Exécuter une commande depuis l'hôte lxc-attach
Utilisation de lxc-attach permet de "s'attacher" à un conteneur et d'exécuter des commandes comme si on étais à l'intérieur du conteneur de manière interactives.
sudo lxc-attach -n conteneur_ubuntu -- ls /
content_copy
toto@srv:~$ sudo lxc-attach -n conteneur_ubuntu -- ls /
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
// Arrêter un serveur Apache
toto@srv:~$ sudo lxc-attach -n conteneur_ubuntu -- sudo systemctl stop apache2
toto@srv:~$ curl -I http://10.0.3.4
curl: (7) Failed to connect to 10.0.3.4 port 80: Connection refused
// Relancer un serveur Apache
toto@srv:~$ sudo lxc-attach -n conteneur_ubuntu -- sudo systemctl start apache2
toto@srv:~$ curl -I http://10.0.3.4
HTTP/1.1 200 OK
Date: Fri, 02 Feb 2024 17:16:31 GMT
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Fri, 02 Feb 2024 16:55:37 GMT
ETag: "2aa6-61068fb36d075"
Accept-Ranges: bytes
Content-Length: 10918
Vary: Accept-Encoding
Content-Type: text/html
Exécuter une commande depuis l'hôte exec
L'utilisation de exec permet d'exécuter un script dans un conteneur avec des paramètres,
ou d'automatiser des tâches.
Le script doit être sur le conteneur !
sudo lxc exec <nom_du_conteneur> bash -c "script.sh param1 param2"
content_copy
Accèder au fichier de configuration d'un conteneur
Si l'on souhaite modifier la configuration d'un conteneur LXC, cela peut être fait en accédant au fichier de configuration :
toto@srv:~$ lxc-stop -n <nom-conteneur>
toto@srv:~$ sudo vim /var/lib/lxc/<nom-conteneur>/config
Exemple Concret
Nous allons créer et manipuler un conteneur Ubuntu.
1- Création d'un Conteneur Ubuntu
toto@srv:~$ sudo lxc-create -t ubuntu -n conteneur_ubuntu
2- Informations sur le Conteneur
Nous avons le conteneur qui vient d'être créé mais qui est actuellement
à l'arrêt.
Pour récupérer la liste des conteneurs utilisables sur la machine :
toto@srv:~$ sudo lxc-ls --fancy
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
conteneur_ubuntu STOPPED 0 - - - false
On peut démarrer le conteneur :
toto@srv:~$ sudo lxc-start conteneur_ubuntu
On peut récupérer les informations sur ce conteneur depuis l'hôte :
toto@srv:~$ sudo lxc-info conteneur_ubuntu
Name: conteneur_ubuntu
State: RUNNING
PID: 39160
IP: 10.0.3.4
CPU use: 0.72 seconds
BlkIO use: 15.59 MiB
Memory use: 31.37 MiB
KMem use: 4.81 MiB
Link: vethEviM6r
TX bytes: 1.52 KiB
RX bytes: 1.64 KiB
Total bytes: 3.16 KiB
3- Limitation des ressources
1- Limitation de la mémoire à 512Mo
Lorsqu'on crée un conteneur LXC, on trouve son fichier de configuration
dans : /var/lib/lxc/conteneur_ubuntu/conf.
Ce fichier de configuration contient des informations telles que le nom
du conteneur, la configuration réseau, etc.
On peut soit modifier ce fichier, soit utiliser des commandes en ligne
de commande pour limiter les ressources du conteneur, que ce soit en
termes de mémoire ou d'utilisation CPU. Dans cet exemple, nous allons voir
comment limiter la mémoire à 512 Mo et l'utilisation du CPU à 50%.
toto@srv:~$ sudo /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
# info -f grub -n 'Simple configuration'
GRUB_DEFAULT=0
.
.
// Modifier cette ligne
GRUB_CMDLINE_LINUX="cgroup_enable=memory"
// Ensuite on doit faire
toto@srv:~$sudo update-grub
Limitation de la mémoire via le Fichier de Configuration
root@srv:/var/lib/lxc# ls
conteneur_ubuntu
root@srv:/var/lib/lxc/conteneur_ubuntu# vim config
// J'insère ces lignes à la fin du fichier
# Limitations mémoire
# Limite stricte de la mémoire (Hard Limit)
lxc.cgroup.memory.limit_in_bytes = 536870912 # 512MB
# Limite souple de la mémoire (Soft Limit)
lxc.cgroup.memory.soft_limit_in_bytes = 268435456 # 256MB
Limitation de la mémoire en Ligne de Commande
Pour appliquer ces commandes le conteneur doit être démarré.
toto@srv:~$ sudo lxc-cgroup -n conteneur_ubuntu memory.soft_limit_in_bytes 268435456
toto@srv:~$ sudo lxc-cgroup -n conteneur_ubuntu memory.limit_in_bytes 53687091
Vérification de la limitation mémoire
Si on a utilisé le fichier de configuration, en toute logique, cela doit
s'appliquer.
Si on a utilisé les commandes en ligne de commande, on peut vérifier :
toto@srv:~$ sudo lxc-cgroup -n conteneur_ubuntu memory.limit_in_bytes
53686272
toto@srv:~$ sudo lxc-cgroup -n conteneur_ubuntu memory.soft_limit_in_bytes
268435456
2- Limitation du CPU
Nativement, LXC ne permet pas de limiter l'utilisation CPU en pourcentage. Cependant, pour simplifier la gestion des ressources CPU, on peut plutôt utiliser le mécanisme de définir le nombre de cœurs CPU autorisés pour un conteneur.
Limitation du CPU via le Fichier de Configuration
root@srv:/var/lib/lxc/conteneur_ubuntu# vim config
// On isnère à la fin du fichier
lxc.cgroup.cpuset.cpus=0,1
// OU
lxc.cgroup.cpu.shares = 512
Limitation du CPU en ligne de commande
Comme pour la mémoire, le conteneur doit être démarré.
toto@srv:~$ sudo lxc-cgroup -n conteneur_ubuntu cpuset.cpus 0,1
4- Installation d’un serveur Apache
Nous allons installer un serveur Apache sur le conteneur, et essayer d'y accéder depuis l'hôte.
root@conteneurubuntu:/# apt install apache2 -y
Vérification de l'installation de Apache.
root@conteneurubuntu:/# systemctl status apache2
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor >
Active: active (running) since Fri 2024-02-02 16:55:39 UTC; 22s ago
Docs: https://httpd.apache.org/docs/2.4/
Main PID: 803 (apache2)
Tasks: 55 (limit: 1049)
Memory: 5.4M
CGroup: /system.slice/apache2.service
├─803 /usr/sbin/apache2 -k start
├─805 /usr/sbin/apache2 -k start
└─806 /usr/sbin/apache2 -k start
Démmarer Apache dès le lancement du conteneur :
root@conteneurubuntu:/# systemctl enable apache2
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable apache2
Depuis l'hôte on peut faire un test de connectivité HTTP, sur le serveur Apache du conteneur.
toto@srv:~$ curl -I http://10.0.3.4
HTTP/1.1 200 OK
Date: Fri, 02 Feb 2024 17:06:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Fri, 02 Feb 2024 16:55:37 GMT
ETag: "2aa6-61068fb36d075"
Accept-Ranges: bytes
Content-Length: 10918
Vary: Accept-Encoding
Content-Type: text/html
5- Exemple de Script complet pour créer un conteneur LXC
- Création d'un conteneur Ubuntu, qui prend en paramètre un nom de conteneur.
- Limitation des ressources mémoire à 512 Mo et du CPU à environ la moitié de sa capacité.
- L'installation d'un serveur Apache.
#!/bin/bash
#
# SCRIPT POUR INSTALLER UN CONTENEUR UBUNTU DANS LXC
#
# DONNER LE DROIT D'EXECUTION AU FICHIER
# chmod +x scriptConteneurLXC
#
# POUR EXECUTER CE FICHIER
# ./scriptConteneurLXC nomDuConteneurUbuntu
#
# AUTHOR : MAHMOUD ILLOURMANE
#
# Nom du conteneur par défaut
DEFAULT_CONTAINER_NAME="monConteneurParDefaut"
# Utilisez le premier argument comme nom de conteneur, sinon utilisez le nom par défaut
CONTAINER_NAME="${1:-$DEFAULT_CONTAINER_NAME}"
echo -e "\e[32mNom du conteneur : \e[0m \e[31m$CONTAINER_NAME\e[0m"
#Installation des templates si ils ne le sont pas déjà
echo -e "\e[32m\nInstallation des templates LXC\e[0m"
sudo apt-get install lxc-templates
echo -e "\n"
echo -e "\e[32mCreation du conteneur : $CONTAINER_NAME \e[0m"
# Création du conteneur
#sudo lxc-create -t $CONTAINER_NAME -- -d ubuntu -r focail -a amd64
sudo lxc-create -t ubuntu -n $CONTAINER_NAME
# Démarrage du conteneur
sudo lxc-start -n $CONTAINER_NAME
# Attente pour s'assurer que le conteneur est bien démarré
sleep 3
# Configuration du fichier de configuration pour les ressources
CONFIG_FILE="/var/lib/lxc/$CONTAINER_NAME/config"
echo -e "\e[32mLimitation des ressources systeme\e[0m"
# Limite mémoire à 256 Mo
echo "# Limitation des ressources systeme" | sudo tee -a $CONFIG_FILE
echo "lxc.cgroup.memory.limit_in_bytes = 256M" | sudo tee -a $CONFIG_FILE
# Limite CPU à 50%
echo -e "\e[35mRessource par défaut pour l'accès au CPU 1024 configuré sur 512\e[0m"
echo "lxc.cgroup.cpu.shares = 512" | sudo tee -a $CONFIG_FILE
# Application des modifications Système
sudo lxc-stop -n $CONTAINER_NAME
sudo lxc-start -n $CONTAINER_NAME
# Configuration du réseau
echo -e "\e[32mConfiguration du reseaux\e[0m"
sudo lxc-attach -n $CONTAINER_NAME -- bash -c "echo 'lxc.net.0.type = veth' >> $CONFIG_FILE"
sudo lxc-attach -n $CONTAINER_NAME -- bash -c "echo 'lxc.net.0.link = lxcbr0' >> $CONFIG_FILE"
sudo lxc-attach -n $CONTAINER_NAME -- bash -c "echo 'lxc.net.0.flags = up' >> $CONFIG_FILE"
# Installation d'Apache
echo -e "\e[32mInstallation du serveur Apache2\e[0m"
sudo lxc-attach -n $CONTAINER_NAME -- apt-get update
sudo lxc-attach -n $CONTAINER_NAME -- apt-get install apache2 -y
# Installation des outils iputils
echo -e "\e[32mInstallation des iputils\e[0m"
sudo lxc-attach -n $CONTAINER_NAME -- apt-get install iputils-ping
# Affichage de l'adresse IP du conteneur
sudo lxc-ls -f
4- Généralités sur LXD
LXD est une extension de la technologie LXC (Linux Containers), offrant une expérience utilisateur améliorée et une gestion plus aisée des conteneurs, avec un accent mis sur la simplicité et la facilité d'utilisation. Bien que LXD soit construit sur LXC, il introduit des fonctionnalités supplémentaires et une nouvelle couche de gestion pour travailler avec des conteneurs. Voici les principales différences entre LXD et LXC :
LXC
- Bas Niveau : LXC est une interface de bas niveau pour les fonctionnalités de conteneurisation du noyau Linux, offrant une couche d'abstraction pour la création et la gestion de conteneurs Linux. LXC fournit un environnement isolé qui imite celui d'une machine physique ou virtuelle.
- Gestion des Conteneurs : Avec LXC, la gestion des conteneurs se fait principalement via la ligne de commande, et l'utilisateur doit souvent interagir directement avec les fichiers de configuration et les commandes système pour gérer les conteneurs.
- Fonctionnalités : LXC permet de contrôler les ressources système (comme le CPU, la mémoire, et le stockage), le réseau, et d'autres aspects des conteneurs de manière détaillée.
LXD
- Niveau Plus Élevé : LXD est souvent décrit comme un "hyperviseur de conteneurs", car il fonctionne à un niveau d'abstraction plus élevé que LXC. LXD s'appuie sur LXC pour les fonctionnalités de conteneurisation, mais ajoute une couche de gestion et des outils de ligne de commande (lxc commande) pour simplifier la création, la gestion et l'orchestration de conteneurs.
- API RESTful : LXD introduit une API RESTful, permettant de gérer les conteneurs à distance et de manière programmatique, facilitant l'intégration avec d'autres outils et systèmes.
- Gestion des Images : LXD fournit un système de gestion des images plus robuste, permettant aux utilisateurs de facilement accéder à des images de conteneurs de diverses distributions Linux, et de gérer leurs propres images.
- Sécurité et Isolation : Bien que LXD utilise LXC sous le capot, il apporte des améliorations en termes de sécurité et d'isolation par défaut, avec des fonctionnalités comme les conteneurs non privilégiés.
- Stockage et Réseau : LXD offre des fonctionnalités avancées pour la gestion du stockage et du réseau, y compris le support pour plusieurs types de stockage (comme ZFS, Btrfs, etc.) et des configurations réseau complexes.
Conclusion
LXD est conçu pour être plus convivial et plus facile à utiliser pour la gestion quotidienne des conteneurs que LXC seul. Il est destiné aux utilisateurs et aux entreprises qui ont besoin de gérer un grand nombre de conteneurs avec facilité, offrant des fonctionnalités avancées d'orchestration, de sécurité et de gestion des ressources. En résumé, LXD étend les capacités de LXC avec une expérience utilisateur améliorée et une gestion simplifiée des conteneurs, tout en conservant la flexibilité et la puissance de LXC pour la conteneurisation au niveau du système d'exploitation.