Guide de Base d'Installation et d'Utilisation de LXC sous Ubuntu

Publié le : 02/02/24
Modifié le : 04/06/24 à 10h55

emoji_objects

Documentation officielle : link

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
emoji_objects

Cette commande vérifiera si le noyau prend en charge LXC et affichera les fonctionnalités activées.

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.
                            ##
                        
                        
emoji_objects

- -t : Cette option spécifie le template à utiliser pour créer le conteneur.
- -n : Cette option permet de définir le nom du conteneur.

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
                        
                        
emoji_objects

Remarque sur les interfaces:
   Dans l'hôte : 9: vethXtdAM3@if2:
   Dans le conteneur : 2: eth0@if9:
il est important de noter que les noms et les configurations des interfaces réseau peuvent différer entre l'hôte et le conteneur, reflétant la séparation et l'isolation entre les deux environnements.
il ne faut pas chercher une logique directe ou une correspondance précise entre les indices d'interface comme if9 ou if2 que on vois dans les configurations réseau de l'hôte et du conteneur.
info Si l'on crée un autre conteneur, nous aurons une nouvelle interface côté hôte ainsi qu'une autre interface sur le nouveau conteneur.

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
emoji_objects

- -n : Dans .12, .13, .14 l'option n'est pas obligatoire.
- exit : Pour quitter le conteneur.

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))
                        
                        
emoji_objects

La commande ss -tulpn exécute une commande pour afficher les sockets réseau en cours d'utilisation dans le conteneur LXC. Plus précisément :
- ss : est un utilitaire pour examiner les sockets réseau.
- -t : spécifie que nous voulons afficher les sockets TCP.
- -u : spécifie que nous voulons afficher les sockets UDP.
- -l : signifie "listening" et indique que nous voulons afficher les sockets en écoute.
- -p : affiche les informations sur le processus qui utilise le socket.
- -n : indique de ne pas résoudre les noms d'hôtes ou de services, ce qui affiche les adresses IP et les numéros de port sous forme numérique.

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.

emoji_objects

- Certains templates peuvent rencontrer des problèmes lors de leur utilisation. On peut rencontrer des erreurs de type :
ERROR: Signature verification for apk.static failed
lxc-create: cnt_1: lxccontainer.c: create_run_template: 1627 Failed to create container from template
xc-create: cnt_1: lxccontainer.c: __lxcapi_create: 1798 Template "lxc-alpine" not found
lxc-create: cnt_1: tools/lxc_create.c: main: 317 Failed to create container cnt_1
lxc-attach: cnt_1: attach.c: get_attach_context: 405 Connection refused - Failed to get init pid
lxc-attach: cnt_1: attach.c: lxc_attach: 1469 Connection refused - Failed to get attach context
etc.

- Une solution est d'utiliser le template download pour la création de conteneur.
Exemple : sudo lxc-create -n <nom_conteneur> -t download
Ou
sudo lxc-create -n C1 -t download -- -d ubuntu -r focal -a amd64
-d : spécifie la distribution (ubuntu)
-r : la version/nom de code (par exemple : focal (20.04))
-a : l'architecture (par exemple : amd64).
On ajuste les valeurs selon vos besoins.

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
                        
                        
emoji_objects

- Link: Le nom de l'interface réseau virtuelle associée au conteneur. Dans cet exemple, il s'agit de "vethEviM6r".
- TX bytes: Le nombre total d'octets transmis depuis cette interface réseau du conteneur. Ici, il indique "1.52 KiB".
- RX bytes: Le nombre total d'octets reçus par cette interface réseau du conteneur. Dans cet exemple, il indique "1.64 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%.

emoji_objects

- Avant de commencer à utiliser cgroup pour limiter la mémoire, il faut s'assurer que le fichier GRUB de notre machine hôte a bien activé explicitement le support des cgroups de mémoire au niveau du noyau Linux au démarrage.

                        
                        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
                        
                        
emoji_objects

- La limite stricte limit_in_bytes est définie à 512MB, ce qui signifie que le conteneur ne peut pas utiliser plus de 512MB de RAM.
- La limite souple soft_limit_in_bytes est définie à 256MB, ce qui permet au système d'aviser ou de commencer à réclamer de la mémoire du conteneur si le système a besoin de ressources.

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
                        
                        
emoji_objects

- lxc.cgroup.cpu.shares = 512 : ne limite pas l'utilisation du CPU à un pourcentage fixe, mais ajuste la priorité de l'accès au CPU. La valeur par défaut est généralement 1024, donc 512 accorderait au conteneur une priorité plus basse par rapport à un conteneur avec la valeur par défaut.

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
                        
                        
emoji_objects

Dans notre exmple 0,1 veut dire que le conteneur utilisera les deux premiers coeurs CPU seulement.

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.