GNU/Linux >> Tutoriels Linux >  >> Linux

Dans les coulisses avec les conteneurs Linux

Pouvez-vous avoir des conteneurs Linux sans Docker ? Sans OpenShift ? Sans Kubernetes ?

Oui, vous pouvez. Des années avant que Docker ne fasse des conteneurs un terme familier (si vous vivez dans un centre de données, c'est-à-dire), le projet LXC a développé le concept d'exécution d'une sorte de système d'exploitation virtuel, partageant le même noyau, mais contenu au sein de groupes de processus définis.

Docker s'appuie sur LXC, et il existe aujourd'hui de nombreuses plates-formes qui exploitent le travail de LXC à la fois directement et indirectement. La plupart de ces plates-formes rendent la création et la maintenance de conteneurs extrêmement simples, et pour les grands déploiements, il est logique d'utiliser de tels services spécialisés. Cependant, tout le monde ne gère pas un déploiement important ou n'a pas accès à de gros services pour en savoir plus sur la conteneurisation. La bonne nouvelle est que vous pouvez créer, utiliser et apprendre des conteneurs avec rien de plus qu'un PC exécutant Linux et cet article. Cet article vous aidera à comprendre les conteneurs en examinant LXC, comment cela fonctionne, pourquoi cela fonctionne et comment résoudre les problèmes en cas de problème.

Éviter la simplicité

Conteneurs Linux

  • Que sont les conteneurs Linux ?
  • Une introduction à la terminologie des conteneurs
  • Télécharger :Introduction aux conteneurs
  • Opérateurs Kubernetes :automatisation de la plate-forme d'orchestration de conteneurs
  • eBook :Modèles Kubernetes pour la conception d'applications cloud natives
  • Qu'est-ce que Kubernetes ?

Si vous recherchez un guide de démarrage rapide sur LXC, consultez l'excellent site Web Linux Containers.

Installation de LXC

S'il n'est pas déjà installé, vous pouvez installer LXC avec votre gestionnaire de paquets.

Sur Fedora ou similaire, entrez :

$ sudo dnf install lxc lxc-templates lxc-doc

Sur Debian, Ubuntu et similaire, entrez :

$ sudo apt install lxc

Créer un pont réseau

La plupart des conteneurs supposent qu'un réseau sera disponible, et la plupart des outils de conteneur s'attendent à ce que l'utilisateur puisse créer des périphériques réseau virtuels. L'unité la plus élémentaire requise pour les conteneurs est le pont réseau, qui est plus ou moins l'équivalent logiciel d'un commutateur réseau. Un commutateur réseau est un peu comme un adaptateur en Y intelligent utilisé pour diviser une prise casque afin que deux personnes puissent entendre la même chose avec des casques différents, sauf qu'au lieu d'un signal audio, un commutateur réseau relie les données du réseau.

Vous pouvez créer votre propre pont réseau logiciel afin que votre ordinateur hôte et votre système d'exploitation de conteneur puissent à la fois envoyer et recevoir différentes données réseau sur un seul périphérique réseau (votre port Ethernet ou votre carte sans fil). Il s'agit d'un concept important qui se perd souvent une fois que vous avez cessé de générer manuellement des conteneurs, car quelle que soit la taille de votre déploiement, il est très peu probable que vous disposiez d'une carte réseau physique dédiée pour chaque conteneur que vous exécutez. Il est essentiel de comprendre que les conteneurs communiquent avec des périphériques réseau virtuels, afin que vous sachiez par où commencer le dépannage si un conteneur perd sa connexion réseau.

Pour créer un pont réseau sur votre machine, vous devez disposer des autorisations appropriées. Pour cet article, utilisez le sudo commande pour fonctionner avec les privilèges root. (Cependant, les documents LXC fournissent une configuration pour accorder aux utilisateurs la permission de le faire sans utiliser sudo .)

$ sudo ip link add br0 type bridge

Vérifiez que l'interface réseau imaginaire a été créée :

$ sudo ip addr show br0
7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc
   noop state DOWN group default qlen 1000
   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff

Depuis br0 est considéré comme une interface réseau, il nécessite sa propre adresse IP. Choisissez une adresse IP locale valide qui n'entre pas en conflit avec une adresse IP existante sur votre réseau et attribuez-la au br0 appareil :

$ sudo ip addr add 192.168.168.168 dev br0

Et enfin, assurez-vous que br0 est opérationnel :

$ sudo ip link set br0 up

Définir la configuration du conteneur

Le fichier de configuration d'un conteneur LXC peut être aussi complexe que nécessaire pour définir la place d'un conteneur dans votre réseau et le système hôte, mais pour cet exemple, la configuration est simple. Créez un fichier dans votre éditeur de texte préféré et définissez un nom pour le conteneur et les paramètres requis du réseau :

lxc.utsname = opensourcedotcom
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.network.ipv4 = 192.168.168.1/24
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596

Enregistrez ce fichier dans votre répertoire personnel sous mycontainer.conf .

Le lxc.utsname est arbitraire. Vous pouvez appeler votre conteneur comme bon vous semble; c'est le nom que vous utiliserez pour le démarrer et l'arrêter.

Le type de réseau est défini sur veth , qui est une sorte de câble de raccordement Ethernet virtuel. L'idée est que le veth la connexion va du conteneur au périphérique de pont, qui est défini par le lxc.network.link propriété, définie sur br0 . L'adresse IP du conteneur se trouve sur le même réseau que le périphérique de pont, mais unique pour éviter les collisions.

À l'exception du veth type de réseau et le haut drapeau de réseau, vous inventez toutes les valeurs dans le fichier de configuration. La liste des propriétés est disponible sur man lxc.container.conf . (S'il manque sur votre système, vérifiez votre gestionnaire de packages pour des packages de documentation LXC distincts.) Il existe plusieurs exemples de fichiers de configuration dans /usr/share/doc/lxc/examples , que vous devriez revoir plus tard.

Lancer un shell de conteneur

À ce stade, vous êtes aux deux tiers du chemin vers un conteneur opérationnel :vous disposez de l'infrastructure réseau et vous avez installé les cartes réseau imaginaires dans un PC imaginaire. Il ne vous reste plus qu'à installer un système d'exploitation.

Cependant, même à ce stade, vous pouvez voir LXC au travail en lançant un shell dans un espace conteneur.

$ sudo lxc-execute --name basic \
--rcfile ~/mycontainer.conf /bin/bash \
--logfile mycontainer.log
#

Dans ce conteneur très simple, regardez votre configuration réseau. Il devrait vous sembler familier, mais unique.

# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state [...]
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
[...]
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> [...] qlen 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
   valid_lft forever preferred_lft forever
inet6 2003:db8:1:0:214:1234:fe0b:3596/64 scope global
   valid_lft forever preferred_lft forever
[...]

Votre conteneur est conscient de sa fausse infrastructure réseau et d'un noyau familier mais unique.

# uname -av
Linux opensourcedotcom 4.18.13-100.fc27.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Utilisez la sortie commande pour quitter le conteneur :

# exit

Installation du système d'exploitation du conteneur

Construire un environnement entièrement conteneurisé est beaucoup plus complexe que les étapes de mise en réseau et de configuration, vous pouvez donc emprunter un modèle de conteneur à LXC. Si vous n'avez pas de modèles, recherchez un package de modèles LXC distinct dans votre référentiel de logiciels.

Les modèles LXC par défaut sont disponibles dans /usr/share/lxc/templates .

$ ls -m /usr/share/lxc/templates/
lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud

Choisissez votre favori, puis créez le conteneur. Cet exemple utilise Slackware.

$ sudo lxc-create --name slackware --template slackware

Regarder un modèle en cours d'exécution est presque aussi instructif que d'en créer un à partir de zéro ; c'est très verbeux, et vous pouvez voir que lxc-create définit la "racine" du conteneur sur /var/lib/lxc/slackware/rootfs et plusieurs packages sont en cours de téléchargement et d'installation dans ce répertoire.

La lecture des fichiers modèles vous donne une idée encore meilleure de ce qui est impliqué :LXC configure une arborescence de périphériques minimale, des fichiers spool communs, une table de systèmes de fichiers (fstab), des fichiers init, etc. Cela empêche également le démarrage de certains services qui n'ont aucun sens dans un conteneur (comme udev pour la détection de matériel). Étant donné que les modèles couvrent un large éventail de configurations Linux typiques, si vous avez l'intention de concevoir le vôtre, il est sage de baser votre travail sur un modèle le plus proche de ce que vous souhaitez configurer; sinon, vous êtes sûr de faire des erreurs d'omission (si rien d'autre) que le projet LXC a déjà trébuché et expliqué.

Une fois que vous avez installé l'environnement de système d'exploitation minimal, vous pouvez démarrer votre conteneur.

$ sudo lxc-start --name slackware \
--rcfile ~/mycontainer.conf

Vous avez démarré le conteneur, mais vous ne vous y êtes pas attaché. (Contrairement à l'exemple de base précédent, vous n'exécutez pas simplement un shell cette fois, mais un système d'exploitation conteneurisé.) Attachez-le par son nom.

$ sudo lxc-attach --name slackware
#

Vérifiez que l'adresse IP de votre environnement correspond à celle de votre fichier de configuration.

# /usr/sbin/ip addr SHOW | grep eth
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...] 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0

Quittez le conteneur et fermez-le.

# exit
$ sudo lxc-stop slackware

Exécuter des conteneurs du monde réel avec LXC

Dans la vraie vie, LXC facilite la création et l'exécution de conteneurs sûrs et sécurisés. Les conteneurs ont parcouru un long chemin depuis l'introduction de LXC en 2008, alors utilisez l'expertise de ses développeurs à votre avantage.

Alors que les instructions LXC sur linuxcontainers.org simplifient le processus, cette visite du côté manuel des choses devrait vous aider à comprendre ce qui se passe dans les coulisses.


Linux
  1. Planifier une tâche avec la commande Linux at

  2. Analyser le noyau Linux avec ftrace

  3. Faites des calculs dans le shell Linux avec GNU bc

  4. Gérer les connexions réseau à partir de la ligne de commande Linux avec nmcli

  5. Premiers pas avec les pare-feux Linux

Renforcez Linux avec des pare-feu

Apprendre Linux avec le Raspberry Pi

Network Manager sur Linux avec des exemples

Allez dans les coulisses avec un guide d'installation et d'utilisation Postman

Sécurisez Linux avec le fichier Sudoers

Comment définir un réseau externe pour les conteneurs dans les conteneurs Linux (LXC)