Comment configurer et utiliser LXD sur Ubuntu 16.04

introduction

Un conteneur Linux est un groupe de processus isolé du reste du système grâce à l’utilisation de fonctions de sécurité du noyau Linux, telles que des espaces de noms et des groupes de contrôle. C’est une construction semblable à une machine virtuelle, mais elle est beaucoup plus légère; vous n’avez pas à faire fonctionner un noyau supplémentaire ni à simuler le matériel. Cela signifie que vous pouvez facilement créer plusieurs conteneurs sur le même serveur.

Par exemple, imaginons que vous ayez un serveur qui exécute plusieurs sites Web pour vos clients. Dans une installation classique, chaque site Web serait un hôte virtuel de la même instance du serveur Web Apache ou Nginx. Mais avec les conteneurs Linux, chaque site Web peut être configuré dans son propre conteneur, avec son propre serveur Web. À l’aide de conteneurs Linux, vous regroupez votre application et ses dépendances dans un conteneur sans affecter le reste du système.

LXD vous permet de créer et de gérer ces conteneurs. LXD fournit un service d’hyperviseur permettant de gérer le cycle de vie complet des conteneurs. Dans ce didacticiel, vous allez configurer LXD et l’utiliser pour exécuter Nginx dans un conteneur. Vous dirigerez ensuite le trafic vers le conteneur afin de rendre le site Web accessible depuis Internet.

Conditions préalables

Pour compléter ce didacticiel, vous aurez besoin des éléments suivants:

Étape 1 - Configuration de LXD

LXD est déjà installé sur Ubuntu, mais vous devez le configurer correctement avant de pouvoir l’utiliser sur un serveur. Vous devez configurer votre compte d’utilisateur pour gérer les conteneurs, puis configurer le type d’arrière-plan de stockage pour stocker les conteneurs et configurer la mise en réseau.

Connectez-vous au serveur à l’aide du compte d’utilisateur non root. Ajoutez ensuite votre utilisateur au groupe + lxd + afin de pouvoir l’utiliser pour effectuer toutes les tâches de gestion des conteneurs:

sudo usermod --append --groups lxd

Déconnectez-vous du serveur et reconnectez-vous afin que votre nouvelle session SSH soit mise à jour avec la nouvelle appartenance au groupe. Une fois connecté, vous pouvez commencer à configurer LXD.

Maintenant, configurez le backend de stockage. Le système de stockage recommandé pour LXD est le système de fichiers ZFS, stocké soit dans un fichier préalloué, soit à l’aide de Block Storage. Pour utiliser le support ZFS dans LXD, mettez à jour votre liste de paquetages et installez le paquetage + zfsutils-linux +:

sudo apt-get update
sudo apt-get install zfsutils-linux

Vous pouvez maintenant configurer LXD. Démarrez le processus d’initialisation LXD avec la commande + lxd init +:

sudo lxd init

Vous serez invité à spécifier les détails du système de stockage. Une fois cette configuration terminée, vous configurerez la mise en réseau des conteneurs.

Tout d’abord, il vous sera demandé si vous souhaitez configurer un nouveau pool de stockage. Vous devriez répondre + oui. +.

Do you want to configure a new storage pool (yes/no) [default=yes]?

Ensuite, vous serez invité à entrer le système de stockage, et vous aurez le choix entre deux options: + dir + ou + zfs +. L’option + dir + indique à LXD de stocker les conteneurs dans des répertoires du système de fichiers du serveur. L’option + zfs + utilise le système de fichiers combiné ZFS et le gestionnaire de volumes logiques.

Nous allons utiliser l’option + zfs +. En utilisant + zfs +, nous obtenons à la fois l’efficacité du stockage et une meilleure réactivité. Par exemple, si nous créons dix conteneurs à partir de la même image de conteneur initiale, ils utilisent tous l’espace disque d’une seule image de conteneur. À partir de ce moment, seules les modifications apportées à l’image de conteneur initiale seront stockées dans le backend de stockage.

OutputName of the storage backend to use (dir or zfs) [default=zfs]:

Une fois que vous avez choisi + zfs +, il vous sera demandé de créer un nouveau pool ZFS et de nommer le pool. Choisissez + yes + pour créer le pool et appelez le pool + lxd +:

OutputCreate a new ZFS pool (yes/no) [default=yes]?
Name of the new ZFS pool [default=lxd]:

On vous demandera ensuite si vous souhaitez utiliser un périphérique de bloc existant:

OutputWould you like to use an existing block device (yes/no) [default=no]?

Si vous dites + yes +, vous devrez dire à LXD où trouver ce périphérique. Si vous dites + no +, LXD utilisera un fichier préalloué. Avec cette option, vous utiliserez l’espace libre sur le serveur lui-même.

Deux sections suivent, selon que vous souhaitez utiliser un fichier préalloué ou un périphérique en mode bloc. Suivez l’étape appropriée pour votre cas. Une fois que vous avez spécifié le mécanisme de stockage, vous allez configurer les options de mise en réseau de vos conteneurs.

Option 1 - Utilisation d’un fichier préalloué

Vous utiliseriez un fichier préalloué si vous n’avez pas accès à un périphérique de stockage de bloc distinct pour stocker les conteneurs. Suivez ces étapes pour configurer LXD afin qu’il utilise un fichier préalloué pour stocker les conteneurs.

Tout d’abord, lorsque vous êtes invité à utiliser un périphérique de bloc existant, entrez + no +:

OutputWould you like to use an existing block device (yes/no) [default=no]?

Ensuite, il vous sera demandé de spécifier la taille du * périphérique de boucle *, c’est-à-dire ce que LXD appelle le fichier préalloué. + Utilisez la taille par défaut suggérée pour le fichier préalloué:

OutputSize in GB of the new loop device (1GB minimum) [default=15]:

En règle générale, 15 Go est vraiment la plus petite taille à créer; vous voulez préallouer suffisamment d’espace de sorte qu’il vous reste au moins 10 Go d’espace libre une fois vos conteneurs créés.

Une fois le périphérique configuré, il vous sera demandé de configurer les paramètres de mise en réseau. Cliquez sur le lien suivant: # step-2-% E2% 80% 94-configuration-mise en réseau [Étape 2] pour continuer la configuration.

Option 2 - Utilisation d’un périphérique de blocage

Si vous envisagez d’utiliser Block Storage comme back-end de stockage, vous devez rechercher le périphérique qui pointe vers le volume Block Storage que vous avez créé afin de le spécifier dans la configuration de LXD. Accédez à l’onglet * Volumes * dans le https://cloud.digitalocean.com [Panneau de configuration DigitalOcean], localisez votre volume, cliquez sur la fenêtre contextuelle * Plus *, puis sur * Instructions de configuration *.

Localisez le périphérique en consultant la commande permettant de formater le volume. Plus précisément, recherchez le chemin spécifié dans la commande + sudo mkfs.ext4 -F +. N’exécutez aucune des commandes de cette page car nous devons simplement trouver le nom de périphérique correct à attribuer à LXD. La figure suivante montre un exemple du nom de périphérique du volume. Vous avez seulement besoin de la partie soulignée par la ligne rouge:

image: https: //assets.digitalocean.com/articles/lxd_containers_ubuntu_1604/6rDyC1l.png [Les instructions de configuration indiquent le périphérique pour le volume de stockage de bloc créé.]

Vous pouvez également identifier le nom du périphérique avec la commande suivante:

ls -l
total 0
lrwxrwxrwx 1 root root  9 Sep  16 20:30  -> ../../sda

Dans ce cas, le nom de périphérique du volume est + / dev / disk / by-id / scsi-0D0_Volume_volume-fra1-01 +, bien que le vôtre puisse être différent.

Une fois que vous avez identifié le nom de périphérique du volume, poursuivez l’installation de LXD. Lorsque vous êtes invité à utiliser un périphérique de bloc existant, choisissez + yes + et indiquez le chemin d’accès à votre périphérique:

Output of the "lxd init" commandWould you like to use an existing block device (yes/no) [default=no]?
Path to the existing block device:

Une fois que vous avez spécifié le disque, il vous sera demandé de configurer les options de mise en réseau.

Étape 2 - Configuration du réseau

Une fois que vous avez configuré le système de stockage, vous serez invité à configurer la mise en réseau pour LXD.

Tout d’abord, LXD vous demande si vous souhaitez le rendre accessible via le réseau. Choisir + yes + vous permettrait de gérer LXD à partir de votre ordinateur local, sans passer par SSH sur ce serveur. Conservez la valeur par défaut + no +:

Output of the "lxd init" command - LXD over the networkWould you like LXD to be available over the network (yes/no) [default=no]?

Si vous souhaitez activer cette option, veuillez consulter LXD 2.0: hôtes distants et conteneur migration pour en savoir plus.

Nous sommes ensuite invités à configurer un pont réseau pour les conteneurs LXD. Cela active les fonctionnalités suivantes:

  • Chaque conteneur obtient automatiquement une adresse IP privée.

  • Les conteneurs peuvent communiquer entre eux via le réseau privé.

  • Chaque conteneur peut établir des connexions à Internet.

  • Les conteneurs que vous créez restent inaccessibles depuis Internet. vous ne pouvez pas établir de connexion à partir d’Internet et atteindre un conteneur à moins que vous ne l’activiez explicitement. Vous apprendrez comment autoriser l’accès à un conteneur spécifique à l’étape suivante.

Lorsqu’il vous est demandé de configurer le pont LXD, choisissez + yes +:

Output of the "lxd init" command - Networking for the containersDo you want to configure the LXD bridge (yes/no) [default=yes]?

La boîte de dialogue suivante s’affiche:

image: https: //assets.digitalocean.com/articles/lxd_containers_ubuntu_1604/u9D79uB.png [Configuration réseau LXD, démarrage de l’assistant de configuration]

Confirmez que vous souhaitez configurer le pont réseau.

On vous demandera de nommer le pont. Acceptez la valeur par défaut.

On vous demandera d’effectuer la configuration réseau pour IPv4 et IPv6. Dans ce tutoriel, nous ne travaillerons qu’avec IPv4.

Lorsqu’il vous est demandé de configurer un sous-réseau IPv4, choisissez * Oui *. Vous serez informé qu’il a configuré un sous-réseau aléatoire pour vous. Sélectionnez * Ok * pour continuer.

Lorsque vous êtes invité à entrer une adresse IPv4 valide, acceptez la valeur par défaut.

Lorsque vous êtes invité à entrer un masque CIDR valide, acceptez la valeur par défaut.

Lorsque vous êtes invité à entrer la première adresse DHCP, acceptez la valeur par défaut. Faites la même chose pour la dernière adresse DHCP, ainsi que pour le nombre maximal de clients DHCP.

Sélectionnez * Oui * lorsque vous êtes invité à NAT le trafic IPv4.

Lorsqu’il vous est demandé de configurer un sous-réseau IPv6, sélectionnez * Non *. Vous verrez la sortie suivante une fois la configuration du réseau terminée:

OutputWarning: Stopping lxd.service, but it can still be activated by:
 lxd.socket
LXD has been successfully configured.

Vous êtes prêt à créer vos conteneurs.

Étape 3 - Création du conteneur Nginx

Vous avez correctement configuré LXD et vous êtes maintenant prêt à créer et gérer votre premier conteneur. Vous gérez les conteneurs avec la commande + lxc +.

Utilisez + lxc list + pour afficher les conteneurs installés disponibles:

lxc list

Vous verrez le résultat suivant:

Output of the "lxd list" commandGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

Comme c’est la première fois que la commande + lxc + communique avec l’hyperviseur LXD, le résultat vous indique que la commande a automatiquement créé un certificat client pour une communication sécurisée avec LXD. Ensuite, il montre des informations sur la manière de lancer un conteneur. Enfin, la commande affiche une liste vide de conteneurs, ce qui est attendu car nous n’avons pas encore créé de fichier.

Créons un conteneur qui exécute Nginx. Pour ce faire, nous allons utiliser la commande + lxc launch + pour créer et démarrer un conteneur Ubuntu 16.04 nommé + webserver +.

Créez le conteneur + webserver +:

lxc launch ubuntu:x webserver

Le + x + dans + ubuntu: x + est un raccourci pour la première lettre de Xenial, le nom de code d’Ubuntu 16.04. + ubuntu: + est l’identifiant du référentiel préconfiguré des images LXD. Vous pouvez aussi utiliser + ubuntu: 16.04 + pour le nom de l’image.

Comme c’est la première fois que vous créez un conteneur, cette commande télécharge l’image du conteneur à partir d’Internet et la met en cache localement afin que, si vous créez un nouveau conteneur, il soit créé plus rapidement. Vous verrez cette sortie lors de la création de votre nouveau conteneur:

OutputGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

Creating webserver
Retrieving image: 100%
Starting webserver

Maintenant que le conteneur est en cours d’exécution, utilisez la commande + lxc list + pour afficher des informations à ce sujet:

lxc list

La sortie affiche une table avec le nom de chaque conteneur, son état actuel, son adresse IP, son type et si des instantanés ont été pris.

Sortie

+-----------+---------+-----------------------+------+------------+-----------+
|  NAME     |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+-----------------------+------+------------+-----------+
| webserver | RUNNING |  (eth0)   |      | PERSISTENT | 0         |
+-----------+---------+-----------------------+------+------------+-----------+

Prenez note de l’adresse IPv4 du conteneur. Vous en aurez besoin pour configurer votre pare-feu afin d’autoriser le trafic provenant du monde extérieur.

Maintenant, installons Nginx à l’intérieur du conteneur:

Étape 4 - Configuration du conteneur Nginx

Connectons-nous au conteneur + webserver + et configurons le serveur Web.

Connectez-vous au conteneur avec la commande + lxc exec +, qui prend le nom du conteneur et les commandes à exécuter:

lxc exec webserver -- sudo --login --user ubuntu

La première chaîne + - + indique que les paramètres de commande pour + lxc + devraient s’arrêter là et que le reste de la ligne sera transmis en tant que commande à exécuter à l’intérieur du conteneur. La commande est + sudo --login --user ubuntu +, qui fournit un shell de connexion pour le compte préconfiguré + ubuntu + à l’intérieur du conteneur.

Une fois dans le conteneur, votre invite de shell ressemble maintenant à ce qui suit.

Outputubuntu@webserver:~$

Cet utilisateur * ubuntu * dans le conteneur dispose d’un accès + sudo + préconfiguré et peut exécuter des commandes + sudo + sans fournir de mot de passe. Cette coquille est limitée aux limites du conteneur. Tout ce que vous exécutez dans ce shell reste dans le conteneur et ne peut pas s’échapper sur le serveur hôte.

Configurons Nginx dans ce conteneur. Mettez à jour la liste des paquets de l’instance Ubuntu à l’intérieur du conteneur et installez Nginx:

sudo apt-get update
sudo apt-get install nginx

Ensuite, éditez la page Web par défaut pour ce site et ajoutez un texte indiquant clairement que ce site est hébergé dans le conteneur + webserver +. Ouvrez le fichier + / var / www / html / index.nginx-debian.html:

sudo nano /var/www/html/index.nginx-debian.html

Apportez les modifications suivantes au fichier:

Fichier édité /var/www/html/index.nginx-debian.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
       width: 35em;
       margin: 0 auto;
       font-family: Tahoma, Verdana, Arial, sans-serif;
   }
</style>
</head>
<body>
<h1>Welcome to nginx !</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

Nous avons édité le fichier à deux endroits et ajouté spécifiquement le texte + sur le serveur Web du conteneur LXD +. Enregistrez le fichier et quittez votre éditeur.

Maintenant, déconnectez-vous du conteneur et revenez sur le serveur hôte:

logout

Utilisez + curl + pour vérifier que le serveur Web du conteneur fonctionne. Vous aurez besoin des adresses IP des conteneurs Web trouvés précédemment avec la commande + lxd list +.

curl http:///

Le résultat devrait être:

Output<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
       width: 35em;
       margin: 0 auto;
       font-family: Tahoma, Verdana, Arial, sans-serif;
   }
</style>
</head>
<body>
<h1>Welcome to nginx !</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

Le serveur Web fonctionne, mais nous ne pouvons y accéder que via l’adresse IP privée. Acheminons les requêtes externes vers ce conteneur afin que le monde entier puisse accéder à notre site Web.

Étape 5 - Transfert des connexions entrantes vers le conteneur Nginx

La dernière pièce du puzzle consiste à connecter le conteneur de serveur Web à Internet. Nginx est installé dans un conteneur et, par défaut, est inaccessible depuis Internet. Nous devons configurer notre serveur pour transférer toutes les connexions qu’il pourrait recevoir d’Internet sur le port + 80 + au conteneur + webserver +. Pour ce faire, nous allons créer une règle + iptables + pour transférer les connexions. Pour en savoir plus sur les IPTables, consultez Comment fonctionne le pare-feu IPtables et https://www.digitalocean.com/community/ tutorials / iptables-essentials-common-pare-feu-règles-et-commandes [IPtables Essentials: règles et commandes communes du pare-feu].

La commande + iptables + nécessite deux adresses IP: l’adresse IP publique du serveur (`) et l'adresse IP privée du conteneur `+ nginx +` (`), que vous pouvez obtenir avec le fichier ` + lxc list + `commande.

Exécutez cette commande pour créer la règle:

PORT= PUBLIC_IP= CONTAINER_IP= \
sudo -E bash -c 'iptables -t nat -I PREROUTING -i eth0 -p TCP -d $PUBLIC_IP --dport $PORT -j DNAT --to-destination $CONTAINER_IP:$PORT -m comment --comment "forward to the Nginx container"'

Voici comment la commande se décompose:

  • + -t nat + spécifie que nous utilisons la table + nat + pour la traduction d’adresse.

  • + -I PREROUTING + spécifie que nous ajoutons la règle à la chaîne PREROUTING.

  • + -i eth0 + spécifie l’interface * eth0 *, qui est l’interface publique par défaut sur les gouttelettes.

  • + -p TCP + indique que nous utilisons le protocole TCP.

  • + -d $ PUBLIC_IP + spécifie l’adresse IP de destination pour la règle.

  • + - dport $ PORT +: spécifie le port de destination (tel que + 80 +).

  • + -j DNAT + indique que nous souhaitons effectuer un saut vers un NAT de destination (DNAT).

  • + - to-destination $ CONTAINER_IP: $ PORT + indique que nous voulons que la demande aille à l’adresse IP du conteneur spécifique et au port de destination.

Vous pouvez lister les règles IPTables en exécutant cette commande:

sudo iptables -t nat -L PREROUTING

Vous verrez une sortie semblable à celle-ci:

Output Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere                    tcp dpt:http /* forward to this container */ to::80
...

Testez maintenant que le serveur Web est réellement accessible depuis Internet en y accédant depuis votre ordinateur local à l’aide de la commande + curl + comme ceci:

curl --verbose  'http://'

Vous verrez les en-têtes suivis du contenu de la page Web que vous avez créée dans le conteneur:

Output*   Trying ...
* Connected to  () port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
...

Cela confirme que les demandes vont au conteneur.

Enfin, pour enregistrer la règle de pare-feu afin qu’elle soit réappliquée après un redémarrage, installez le package + iptables-persistent +:

sudo apt-get install iptables-persistent

Lors de l’installation du package, vous serez invité à enregistrer les règles de pare-feu actuelles. Acceptez et enregistrez toutes les règles en vigueur.

Lorsque vous redémarrez votre ordinateur, la règle de pare-feu sera présente. De plus, le service Nginx dans votre conteneur LXD redémarrera automatiquement.

Maintenant que vous avez tout configuré, voyons comment le démolir.

Étape 5 - Arrêt et retrait du conteneur

Vous pouvez décider de retirer le conteneur et de le remplacer. Passons à travers ce processus:

Pour arrêter le conteneur, utilisez + lxc stop +:

lxc stop

Utilisez la commande + lxc list + pour vérifier le statut.

Output+-----------+---------+------+------+------------+-----------+
|   NAME    |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+------+------+------------+-----------+
| webserver | STOPPED |      |      | PERSISTENT | 0         |
+-----------+---------+------+------+------------+-----------+

Pour supprimer le conteneur, utilisez + lxc delete +:

lxc delete webserver

Lancer à nouveau + lxc list + montre qu’il n’y a pas de conteneur en cours d’exécution:

Output+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

Utilisez la commande + lxc help + pour afficher des options supplémentaires.

Pour supprimer la règle de pare-feu qui achemine le trafic vers le conteneur, localisez d’abord la règle dans la liste des règles avec cette commande, qui associe un numéro de ligne à chaque règle:

sudo iptables -t nat -L PREROUTING --line-numbers

Vous verrez votre règle, préfixée par un numéro de ligne, comme ceci:

OutputChain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
   DNAT       tcp  --  anywhere                   tcp dpt:http /* forward to the Nginx container */ to:

Utilisez ce numéro de ligne pour supprimer la règle:

sudo iptables -t nat -D PREROUTING

Assurez-vous que la règle a disparu en listant à nouveau les règles:

`sudo iptables -t nat -L PREROUTING --line-numbers`

La règle aura disparu:

OutputChain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Enregistrez maintenant les modifications afin que la règle ne revienne pas lorsque vous redémarrez votre serveur:

sudo netfilter-persistent save

Vous pouvez maintenant faire apparaître un autre conteneur avec vos propres paramètres et ajouter une nouvelle règle de pare-feu pour lui transférer le trafic.

Conclusion

Vous avez configuré un site Web en utilisant Nginx exécuté dans un conteneur LXD. À partir de là, vous pouvez configurer plusieurs sites Web, chacun confiné à son propre conteneur, et utiliser un proxy inverse pour diriger le trafic sur le conteneur approprié. Le tutoriel Comment utiliser Héberger plusieurs sites Web avec Nginx et HAProxy Utiliser LXD sur Ubuntu 16.04 vous explique comment configurer cela.

LXD vous permet également de prendre des instantanés de l’état complet des conteneurs, ce qui facilite la création de sauvegardes et la restauration des conteneurs ultérieurement. Et si vous installez LXD sur deux serveurs différents, il est possible de les connecter et de migrer les conteneurs entre serveurs sur Internet.

Pour plus d’informations sur LXD, voir cette série d’articles de blog sur LXD 2.0 écrite par le responsable de LXD .

Vous pouvez également try LXD en ligne et suivez le didacticiel sur le Web pour vous entraîner davantage.