Fonctionnalités de base de LXD - Systèmes de conteneurs Linux
LXD est le gestionnaire de conteneurs système de nouvelle génération, donc il dit source. Il offre une interface utilisateur similaire aux machines virtuelles, mais utilise à la place des conteneurs Linux.
Noyau LXD est un démon privilégié (un service exécuté avec les droits root) qui fournit une API REST via un socket Unix local, ainsi que via le réseau si la configuration appropriée est installée. Les clients, tels que l'outil de ligne de commande fourni avec LXD, effectuent des requêtes via cette API REST. Cela signifie que que vous accédiez à un hôte local ou à un hôte distant, tout fonctionne de la même manière.
Dans cet article, nous ne nous attarderons pas en détail sur les concepts de LXD, nous ne considérerons pas toutes les capacités disponibles décrites dans la documentation, y compris la récente implémentation dans les dernières versions de LXD du support des machines virtuelles QEMU en parallèle avec les conteneurs. Au lieu de cela, nous apprendrons uniquement les bases de la gestion des conteneurs : configuration des pools de stockage, mise en réseau, exécution d'un conteneur, application des limites de ressources et comment utiliser les instantanés afin que vous puissiez acquérir une compréhension de base de LXD et utiliser des conteneurs sous Linux.
Pour des informations complètes, veuillez vous référer à la source officielle :
Cela signifie que deux packages seront installés en même temps, l'un en tant que package système et l'autre en tant que package snap. L'installation de deux packages sur un système peut créer un problème dans lequel le package système peut devenir orphelin si le package snap est supprimé par le gestionnaire de packages snap.
Rechercher un forfait lxd dans le référentiel snap, vous pouvez utiliser la commande suivante :
snap find lxd
Name Version Summary
lxd 3.21 System container manager and API
lxd-demo-server 0+git.6d54658 Online software demo sessions using LXD
nova ocata OpenStack Compute Service (nova)
nova-hypervisor ocata OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder 1.0 Image builder for LXC and LXD
fabrica 0.1 Build snaps by simply pointing a web form to...
satellite 0.1.2 Advanced scalable Open source intelligence platform
En exécutant la commande list vous pouvez vous assurer que le colis lxd pas encore installé :
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
Bien que LXD soit un package snap, il doit être installé via le package système. lxd, qui créera le groupe correspondant dans le système, les utilitaires nécessaires dans /usr/bin etc.
sudo apt update
sudo apt install lxd
Assurons-nous que le package est installé en tant que package snap :
snap list
Name Version Rev Tracking Publisher Notes
core 16-2.43.3 8689 stable canonical✓ core
lxd 3.21 13474 stable/… canonical✓ -
Installation de LXD sur les distributions Arch Linux ^
Pour installer le package LXD sur le système, vous devez exécuter les commandes suivantes, la première mettra à jour la liste des packages sur le système disponibles dans le référentiel, la seconde installera directement le package :
sudo pacman -Syyu && sudo pacman -S lxd
Après avoir installé le package, afin de gérer LXD par un utilisateur régulier, il doit être ajouté au groupe système lxd:
sudo usermod -a -G lxd user1
Assurons-nous que l'utilisateur user1 ajouté au groupe lxd:
id -Gn user1
user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd
Si le groupe lxd n'est pas visible dans la liste, vous devez alors réactiver la session utilisateur. Pour ce faire, vous devez vous déconnecter et vous connecter sous le même utilisateur.
Activer dans systemd chargement du service LXD au démarrage du système :
Avant de commencer l’initialisation, nous devons comprendre comment le stockage dans LXD est organisé logiquement.
Stockage (Stockage) se compose de d'un ou plusieurs Pool de stockage qui utilise l'un des systèmes de fichiers pris en charge tels que ZFS, BTRFS, LVM ou des répertoires standards. Chaque Pool de stockage est divisé en volumes (Volume de stockage) qui contiennent des images, des conteneurs ou des données à d'autres fins.
Des images - ce sont des distributions spécialement assemblées sans le noyau Linux et disponibles à partir de sources externes
Containers - ce sont des distributions déployées à partir d'images, prêtes à l'emploi
Instantanés - ce sont des instantanés de l'état des conteneurs auxquels vous pouvez revenir
Pour gérer le stockage dans LXD, utilisez la commande lxc storage un certificat pour lequel vous pouvez obtenir en précisant la clé - lxc storage --help
La commande suivante affiche une liste de tous Pool de stockage dans le stockage LXD :
lxc storage list
+---------+-------------+--------+--------------------------------+---------+
| NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool | | btrfs | /dev/loop1 | 2 |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool | | btrfs | /var/lib/lxd/disks/ssdpool.img | 4 |
+---------+-------------+--------+--------------------------------+---------+
Pour afficher une liste de tous Volume de stockage dans le sélectionné Pool de stockage sert l'équipe lxc storage volume list:
lxc storage volume list hddpool
+-------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-------+----------------------------------+-------------+---------+
lxc storage volume list ssdpool
+-----------+----------------------------------+-------------+---------+
| TYPE | NAME | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3 | | 1 |
+-----------+----------------------------------+-------------+---------+
| container | jupyter | | 1 |
+-----------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... | | 1 |
+-----------+----------------------------------+-------------+---------+
Aussi, si pour Pool de stockage Lors de la création, le système de fichiers BTRFS a été sélectionné, puis obtenez une liste Volume de stockage ou sous-volumes dans l'interprétation BTRFS, vous pouvez utiliser la boîte à outils de ce système de fichiers :
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool
ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool
ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3
Avant de créer et d'utiliser des conteneurs, vous devez effectuer une initialisation générale LXD qui crée et configure le réseau et le stockage. Cela peut être fait manuellement à l'aide des commandes client standard disponibles dans la liste en appelant la commande lxc --help ou en utilisant l'assistant d'initialisation lxd init répondre à quelques questions.
Sélection d'un système de fichiers pour le pool de stockage ^
Lors de l'initialisation, LXD pose plusieurs questions, notamment la détermination du type de système de fichiers pour le système par défaut. Pool de stockage. Par défaut, le système de fichiers BTRFS est sélectionné pour cela. Il sera impossible de passer à un autre FS après la création. Pour sélectionner un FS, il est suggéré tableau de comparaison des fonctionnalités:
Fonctionnalité
Annuaire
Btrfs
LVM
ZFS
CEPH
Stockage d'images optimisé
aucune
Oui
Oui
Oui
Oui
Création d'instance optimisée
aucune
Oui
Oui
Oui
Oui
Création d'instantanés optimisée
aucune
Oui
Oui
Oui
Oui
Pilote de stockage utilisable à l'intérieur d'un conteneur
Oui
Oui
aucune
aucune
aucune
Restauration à partir d'anciens instantanés (pas les plus récents)
Oui
Oui
Oui
aucune
Oui
Quotas de stockage
Oui(*)
Oui
Oui
Oui
aucune
Initialisation du réseau et du pool de stockage à l'aide de l'assistant ^
La commande suivante que nous examinerons suggère de configurer les principaux composants de LXD en répondant à des questions simples à l'aide de l'assistant d'initialisation.
Exécuter la commande lxc init et saisissez les réponses aux questions après les deux points comme indiqué dans l'exemple ci-dessous ou modifiez-les selon vos conditions :
lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]: ssdpool
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing block device? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]:
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]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
À l'étape précédente, nous avons créé Pool de stockage qui a reçu le nom ssdpool et dont le fichier se trouve sur mon système à l'adresse /var/lib/lxd/disks/ssdpool.img. Cette adresse du système de fichiers correspond au disque SSD physique de mon PC.
Les actions suivantes, pour approfondir la compréhension du rôle joué par Pool de stockage dans le dépôt, nous allons en créer un deuxième Pool de stockage qui sera physiquement situé sur un autre type de disque, le disque dur. Le problème est que LXD ne vous permet pas de créer Pool de stockage hors adresse /var/lib/lxd/disks/ et même les liens symboliques ne fonctionneront pas, voir la réponse du développeur. Nous pouvons contourner cette limitation lors de l'initialisation/formatage Pool de stockage en spécifiant la valeur en tant que périphérique bloc au lieu du chemin d'accès au fichier de bouclage en le spécifiant dans la clé source.
Alors avant de créer Pool de stockage vous devez définir un fichier de bouclage ou une partition existante sur votre système de fichiers qu'il utilisera. Pour ce faire, nous allons créer et utiliser un fichier dont nous limiterons la taille à 10 Go :
dd if=/dev/zero of=/mnt/work/lxd/hddpool.img bs=1MB count=10000
10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s
Connectons le fichier de bouclage à un périphérique de bouclage gratuit :
Merci à la clé --show l'exécution de la commande renvoie à l'écran le nom de l'appareil auquel notre fichier de bouclage est connecté. Si nécessaire, nous pouvons afficher une liste de tous les appareils occupés de ce type pour nous assurer que nos actions sont correctes :
Dans la liste, vous pouvez constater que l'appareil a /dev/loop1 fichier de bouclage inclus /mnt/work/lxd/hddpool.img, et dans l'appareil /dev/loop0 fichier de bouclage inclus /var/lib/lxd/disks/ssdpool.img ce qui correspond à la valeur par défaut Pool de stockage.
La commande suivante en crée un nouveau Pool de stockage dans LXD sur la base du fichier de bouclage que nous venons de préparer. LXD formatera le fichier de bouclage /mnt/work/lxd/hddpool.img dans l'appareil /dev/loop1 pour le système de fichiers BTRFS :
Après la création Pool de stockage, si nécessaire, il peut être étendu. Pour Pool de stockage en fonction du système de fichiers BTRFS, exécutez les commandes suivantes :
Insertion automatique d'un fichier de bouclage dans un emplacement de périphérique de bouclage ^
Nous avons un petit problème, lors du redémarrage du système hôte, le fichier /mnt/work/lxd/hddpool.img va "voler" hors de l'appareil /dev/loop1 et le service LXD plantera lors du chargement car il ne le verra pas sur cet appareil. Pour résoudre ce problème, vous devez créer un service système qui insérera ce fichier dans l'appareil /dev/loop1 lorsque le système hôte démarre.
créons unité Type de fichier service в /etc/systemd/system/ pour le système d'initialisation SystemD :
cat << EOF | sudo tee -a /etc/systemd/system/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img
RemainAfterExit=true
[Install]
WantedBy=local-fs.target
EOF
Activez le service :
sudo systemctl enable lxd-hddpool
Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.
Après avoir redémarré le système hôte, nous vérifions l'état du service :
systemctl status lxd-hddpool.service
● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
Main PID: 711 (code=exited, status=0/SUCCESS)
апр 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
апр 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).
À partir du résultat, nous pouvons vérifier que l'état du service est infection, malgré le fait que l'exécution de notre script à partir d'une commande était terminée, l'option nous a permis de le faire RemainAfterExit=true.
Étant donné que tous les processus conteneurs s'exécutent en fait de manière isolée sur le système hôte à l'aide de son noyau, pour protéger davantage l'accès des processus conteneurs au système hôte, LXD offre le privilège de processus, où :
Conteneurs privilégiés - ce sont des conteneurs dans lesquels les processus avec UID et GID correspondent au même propriétaire que sur le système hôte. Par exemple, un processus exécuté dans un conteneur avec un UID de 0 a tous les mêmes droits d'accès qu'un processus sur le système hôte avec un UID de 0. En d'autres termes, l'utilisateur root dans le conteneur a tous les droits non seulement dans le conteneur, mais aussi sur le système hôte s'il peut sortir de l'espace de noms isolé du conteneur.
Conteneurs non privilégiés - ce sont des conteneurs dans lesquels les processus appartiennent au propriétaire de l'UID et du GID avec un numéro de 0 à 65535, mais pour le système hôte, le propriétaire est masqué à l'aide des bits SubUID et SubGID ajoutés, respectivement. Par exemple, un utilisateur avec UID=0 dans un conteneur sera vu sur le système hôte comme SubUID + UID. Cela protège le système hôte, car si un processus dans le conteneur est capable de s'échapper de son espace de noms isolé, il ne peut communiquer avec le système hôte qu'en tant que processus avec un UID/GID inconnu et très élevé.
Par défaut, les conteneurs nouvellement créés ont un statut non privilégié et nous devons donc définir un SubUID et un SubGID.
Créons deux fichiers de configuration dans lesquels nous définirons respectivement le masque pour SubUID et SubGID :
Puisque nous avons précédemment initialisé le réseau à l'aide de l'assistant d'initialisation lxd init et créé un périphérique réseau lxdbr0, puis dans cette section, nous nous familiariserons simplement avec la mise en réseau dans LXD et comment créer un commutateur virtuel (pont) à l'aide de la commande client.
Le diagramme suivant montre comment un commutateur (pont) connecte l'hôte et les conteneurs à un réseau :
Les conteneurs peuvent communiquer via un réseau avec d'autres conteneurs ou avec l'hôte sur lequel ces conteneurs sont servis. Pour ce faire, vous devez relier les cartes réseau virtuelles des conteneurs avec un commutateur virtuel. Nous allons d'abord créer un commutateur, et les interfaces réseau du conteneur seront liées dans les chapitres suivants, une fois le conteneur lui-même créé.
La commande suivante crée un commutateur avec un sous-réseau 10.0.5.0/24 et adresse IPv4 10.0.5.1/24, et comprend également ipv4.nat afin que les conteneurs puissent accéder à Internet via l'hôte en utilisant le service NAT :
Chaque conteneur dans LXD a sa propre configuration et peut l'étendre avec des configurations déclarées globalement appelées profils de configuration. L'application de profils de configuration à un conteneur a un modèle en cascade, l'exemple suivant le démontre :
Dans cet exemple, trois profils ont été créés dans le système LXD : default, hddpool и hostfs. Les trois profils sont appliqués à un conteneur qui a une configuration locale (zone grise). Profil default possède un appareil root qui a un paramètre pool est ssdpool, mais grâce au modèle d'application de configuration en cascade, nous pouvons appliquer un profil au conteneur hddpool qui a un paramètre pool remplacera le même paramètre du profil default et le conteneur recevra la configuration de l'appareil root avec paramètre pool égal hddpool, et le profil hostfs ajoute simplement un nouveau périphérique au conteneur.
Pour voir la liste des profils de configuration disponibles, utilisez la commande suivante :
lxc profile list
+---------+---------+
| NAME | USED BY |
+---------+---------+
| default | 1 |
+---------+---------+
| hddroot | 0 |
+---------+---------+
| ssdroot | 1 |
+---------+---------+
Une liste complète des commandes disponibles pour travailler avec un profil peut être obtenue en ajoutant la clé --help:
lxc profile --help
Description:
Manage profiles
Usage:
lxc profile [command]
Available Commands:
add Add profiles to instances
assign Assign sets of profiles to instances
copy Copy profiles
create Create profiles
delete Delete profiles
device Manage instance devices
edit Edit profile configurations as YAML
get Get values for profile configuration keys
list List profiles
remove Remove profiles from instances
rename Rename profiles
set Set profile configuration keys
show Show profile configurations
unset Unset profile configuration keys
Profil de configuration par défaut default n'a pas de configuration de carte réseau pour le conteneur et tous les conteneurs nouvellement créés n'ont pas de réseau, pour eux, il est nécessaire de créer des périphériques réseau locaux (dédiés) avec une commande séparée, mais nous pouvons créer un périphérique réseau global dans la configuration profil qui sera partagé entre tous les conteneurs utilisant ce profil. De cette façon, immédiatement après la commande de création d’un nouveau conteneur, ils disposeront d’un réseau avec accès au réseau. En même temps, il n'y a aucune restriction, nous pouvons toujours créer un périphérique réseau local plus tard si nécessaire.
La commande suivante ajoutera l'appareil au profil de configuration eth0 типа nic connecté au réseau lxdbr0:
lxc profile device add default eth0 nic network=lxdbr0 name=eth0
Il est important de noter que puisque nous avons effectivement ajouté l'appareil au profil de configuration, si nous avons spécifié une adresse IP statique dans l'appareil, alors tous les conteneurs qui utiliseront ce profil partageront la même adresse IP. S'il est nécessaire de créer un conteneur avec une adresse IP statique allouée au conteneur, vous devez alors créer une configuration de périphérique réseau au niveau du conteneur (configuration locale) avec le paramètre d'adresse IP, et non au niveau du profil.
Vérifions le profil :
lxc profile show default
config: {}
description: Default LXD profile
devices:
eth0:
name: eth0
network: lxdbr0
type: nic
root:
path: /
pool: ssdpool
type: disk
name: default
used_by: []
Dans ce profil, nous pouvons voir que pour tous les conteneurs nouvellement créés, deux appareils seront créés :
eth0 - Type d'appareil nic connecté à un switch (pont réseau) lxdbr0
root - Type d'appareil disk qui utilise un pool de stockage ssdpool
Pour utiliser précédemment créé Pool de stockage conteneurs, créer un profil de configuration ssdroot dans lequel nous ajouterons un appareil comme disk avec point de montage / (racine) en utilisant le fichier créé précédemment Pool de stockage - ssdpool:
Les conteneurs sont créés à partir d'images provenant de distributions spécialement assemblées ne possédant pas de noyau Linux. Par conséquent, avant d’exécuter le conteneur, il doit être déployé à partir de cette image. La source des images est un référentiel local dans lequel les images sont téléchargées à partir de référentiels externes.
Pour afficher un nombre limité de colonnes nous avons utilisé l'option -c avec paramètres dasut, et a également limité la longueur de la liste avec la commande head.
Le filtrage est disponible pour afficher une liste d’images. La commande suivante listera toutes les architectures de distribution disponibles AlpineLinux:
Pour commencer à utiliser le conteneur, vous devez ajouter une image du référentiel global au référentiel local local:. Maintenant le dépôt local est vide, la commande s'en assurera lxc image list. Si la méthode list ne spécifiez pas de référentiel, alors le référentiel local sera utilisé par défaut - local:
lxc image list local:
+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+
Les images du référentiel sont gérées à l'aide des méthodes suivantes :
Équipe
description
image lxc alias
Gérer les alias d'images
image lxc copier
Copier des images entre serveurs
image lxc effacer
Supprimer des images
image lxc éditer
Modifier les propriétés de l'image
image lxc Exporter
Exporter et télécharger des images
image lxc importer
Importer des images dans le magasin d'images
image lxc info
Afficher des informations utiles sur les images
image lxc liste
Lister les images
image lxc rafraîchir
Actualiser les images
image lxc montrer
Afficher les propriétés de l'image
Copiez l'image dans le référentiel local à partir du référentiel global images::
En plus du mode interactif, LXD prend également en charge un mode d'installation de configuration non interactif, c'est-à-dire lorsque la configuration est spécifiée sous la forme d'un fichier YAML, un format spécial qui permet d'installer toute la configuration en une seule fois, en contournant l'exécution. de nombreuses commandes interactives abordées ci-dessus dans cet article, notamment la configuration du réseau, la création de profils de configuration, etc. Nous ne couvrirons pas ce domaine ici, vous pouvez le vérifier par vous-même. dans la documentation.
Commande interactive suivante lxc config que nous allons examiner vous permet de définir la configuration. Par exemple, pour garantir que les images téléchargées dans le référentiel local ne sont pas automatiquement mises à jour depuis les référentiels globaux, nous pouvons activer ce comportement avec la commande suivante :
Pour créer un conteneur utilisez la commande lxc init auquel les valeurs sont transmises репозиторий:образ puis l'ID souhaité pour le conteneur. Le référentiel peut être spécifié comme local local: il en va de même pour n’importe quel système mondial. Si le référentiel n'est pas spécifié, le référentiel local est utilisé par défaut pour rechercher l'image. Si l'image est spécifiée à partir du référentiel global, elle sera d'abord téléchargée vers le référentiel local, puis utilisée pour créer le conteneur.
Exécutons la commande suivante pour créer notre premier conteneur :
lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot
Regardons les touches de commande que nous utilisons ici dans l'ordre :
alpine3 — Un alias (alias) est spécifié pour l'image précédemment téléchargée vers le référentiel local. Si l'alias n'a pas été créé pour cette image, vous pouvez toujours faire référence à l'image par son Empreinte Digitale qui est affiché dans le tableau.
alp — Définit l'identifiant du conteneur
--storage — Cette touche indique dans quel Pool de stockage un conteneur sera créé
--profile — Ces clés appliquent en cascade la configuration des profils de configuration précédemment créés au conteneur
On lance le conteneur, qui commence à lancer le système init de la distribution :
lxc start alp
Vous pouvez également utiliser la commande lxc launch ce qui permet de regrouper des équipes lxc init и lxc start en une seule opération.
Vérification de l'état du conteneur :
lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME | STATE | IPV4 | IPV6 | TYPE | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp | RUNNING | 10.0.5.46 (eth0) | | CONTAINER | hddpool |
+------+---------+------------------+------+-----------+--------------+
Dans la section profiles nous pouvons nous assurer que ce conteneur utilise deux profils de configuration - default и hddroot. Dans la section devices nous ne pouvons détecter qu'un seul appareil car le périphérique réseau a été créé au niveau du profil default. Afin de voir tous les appareils utilisés par le conteneur, vous devez ajouter une clé --expanded:
Si nous essayons de définir une adresse IP pour un périphérique réseau eth0 l'équipe lxc config device set alp destiné à la configuration du conteneur, nous recevrons alors une erreur qui signalera que le périphérique n'existe pas car le périphérique eth0 qui est utilisé par le conteneur appartient au profil default:
lxc config device set alp eth0 ipv4.address 10.0.5.5
Error: The device doesn't exist
Nous pouvons bien sûr définir une adresse IP statique pour eth0 appareils dans le profil, mais il en sera de même pour tous les conteneurs qui utiliseront ce profil. Ajoutons donc un périphérique dédié au conteneur :
lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5
Ensuite, vous devez redémarrer le conteneur :
lxc restart alp
Si nous regardons maintenant la configuration du conteneur, nous n'avons pas besoin d'utiliser l'option --expanded pour voir le périphérique réseau eth0, puisque nous l'avons créé au niveau du conteneur et qu'il a été diffusé en cascade sur le même appareil à partir du profil default:
Pour exécuter des commandes directement dans un conteneur, en contournant les connexions réseau, utilisez la commande lxc exec qui exécute les commandes dans le conteneur sans lancer le shell système. Si vous devez exécuter une commande dans un shell en utilisant des modèles de shell tels que des variables, des redirections de fichiers (pipe), etc., vous devez alors lancer explicitement le shell et transmettre la commande sous forme de clé, par exemple :
lxc exec alp -- /bin/sh -c "echo $HOME"
La commande a utilisé un caractère d'échappement spécial pour caractère spécial $ pour que la variable $HOME n'a pas été interprété sur la machine hôte, mais a été interprété uniquement à l'intérieur du conteneur.
Il est également possible de démarrer le mode shell interactif, puis de terminer la session en exécutant le raccourci clavier CTRL+D:
Dans LXD, vous pouvez gérer les ressources du conteneur à l'aide d'un ensemble spécial de configuration. Une liste complète des paramètres de configuration du conteneur peut être trouvée dans la documentation.
Paramètre limits.memory limite la quantité de RAM disponible pour le conteneur. La valeur est un nombre et l'un des suffixes disponibles.
Fixons la limite de RAM du conteneur à 256 Mo :
lxc config set alp limits.memory 256MB
Il existe également d'autres paramètres pour limiter la mémoire :
limits.memory.enforce
limits.memory.hugepages
limits.memory.swap
limits.memory.swap.priority
Équipe lxc config show vous permet d'afficher l'intégralité de la configuration du conteneur, y compris la limite de ressources appliquée qui a été définie :
Il existe plusieurs façons de limiter les ressources du processeur. types de restrictions:
limit.cpu - lie un conteneur à un ou plusieurs cœurs de processeur
limits.cpu.allowance - gère soit les quotas du planificateur CFS lorsque la limite de temps est dépassée, soit le mécanisme universel de partage des ressources CPU lorsque le pourcentage est dépassé
limits.cpu.priority - priorité du planificateur lorsque plusieurs instances partageant un ensemble de processeurs se voient attribuer le même pourcentage de processeurs
En plus des restrictions telles limits.read, limits.write on peut également limiter la quantité d'espace disque consommé par le conteneur (fonctionne uniquement avec ZFS ou BTRFS) :
lxc config device set alp root size=2GB
Après installation, dans le paramètre devices.root.size Nous pouvons vérifier la limite fixée :
lxc config show alp
...
devices:
root:
path: /
pool: hddpool
size: 2GB
type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""
Pour afficher les quotas de disque utilisés, nous pouvons obtenir à partir de la commande lxc info:
lxc info alp
...
Resources:
Processes: 5
Disk usage:
root: 1.05GB
CPU usage:
CPU usage (in seconds): 1
Memory usage:
Memory (current): 5.46MB
Network usage:
eth0:
Bytes received: 802B
Bytes sent: 1.59kB
Packets received: 4
Packets sent: 14
lo:
Bytes received: 0B
Bytes sent: 0B
Packets received: 0
Packets sent: 0
Malgré le fait que nous ayons fixé une limite pour le périphérique racine du conteneur à 2 Go, les utilitaires système tels que df ne verra pas cette restriction. Pour ce faire, nous allons effectuer un petit test et découvrir comment cela fonctionne.
Créons 2 nouveaux conteneurs identiques dans le même Pool de stockage (pool disque dur) :
lxc exec alp1 -- ls -lh
total 1000M
-rw-r--r-- 1 root root 1000.0M Mar 27 10:16 file.img
Si nous regardons dans le deuxième conteneur, vérifions l'existence d'un fichier au même emplacement, alors ce fichier ne sera pas là, ce qui est attendu, puisque les conteneurs sont créés dans leur propre Volume de stockage dans le même Pool de stockage:
lxc exec alp2 -- ls -lh
total 0
Mais comparons les valeurs qu'il produit df sur l'un et l'autre conteneur :
lxc exec alp1 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
lxc exec alp2 -- df -hT
Filesystem Type Size Used Available Use% Mounted on
/dev/loop1 btrfs 9.3G 1016.4M 7.8G 11% /
...
Appareil /dev/loop1 monté car la partition racine est Pool de stockage que ces conteneurs utilisent, ils partagent donc son volume entre deux.
LXD a la capacité de créer des instantanés et de restaurer l'état du conteneur à partir d'eux.
Pour créer un instantané, exécutez la commande suivante :
lxc snapshot alp snapshot1
Équipe lxc snapshot aucune clé disponible list, par conséquent, pour afficher la liste des instantanés, vous devez utiliser la commande qui affiche des informations générales sur le conteneur :
lxc info alp
...
...
Snapshots:
snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)
Vous pouvez restaurer un conteneur à partir d'un instantané à l'aide de la commande lxc restore en spécifiant le conteneur pour lequel la restauration sera effectuée et l'alias de l'instantané :
lxc restore alp snapshot1
La commande suivante est utilisée pour supprimer un instantané. Veuillez noter que la syntaxe de la commande n'est pas similaire à toutes les autres ; ici, vous devez spécifier une barre oblique après le nom du conteneur. Si la barre oblique est omise, alors la commande de suppression d'un instantané est interprétée comme une commande de suppression d'un conteneur !
lxc delete alp/snapshot1
Dans l’exemple ci-dessus, nous avons examiné ce que l’on appelle les instantanés sans état. LXD propose un autre type d'instantanés - avec état, qui enregistre l'état actuel de tous les processus dans le conteneur. Il existe un certain nombre de fonctionnalités intéressantes et utiles associées aux instantanés avec état.