Guide des conteneurs Linux: une introduction aux conteneurs

Les conteneurs sont un mot à la mode depuis des années... mais que sont-ils exactement ?

Les conteneurs sont une méthode d'exécution d'applications virtualisées sur votre ordinateur, similaire aux machines virtuelles, mais utilisant un ensemble différent de technologies sous-jacentes. Ils peuvent être complexes à comprendre, mais ils sont essentiels pour tout gérer, depuis Minecraft serveurs à Google. Et nous allons vous montrer comment les configurer.

Nous utiliserons Linux, un système d'exploitation conçu en mettant l'accent sur la portabilité, la modularité et la stabilité. Linux est présent dans tout, des serveurs aux micro-ondes en passant par les consoles de jeux vidéo. Les conteneurs ne se limitent pas à fonctionner sous Linux, mais les technologies qui les sous-tendent sont les mieux adaptées et fonctionnent mieux sous Linux. Si vous êtes nouveau sur Linux, nous vous recommandons de consulter notre Guide du débutant avant de plonger.

Les conteneurs sont-ils des machines virtuelles?

Les conteneurs peuvent être un sujet complexe, mais il est préférable de commencer par un point clé: un conteneur est pas une machine virtuelle. Une machine virtuelle est une version simulée d'un matériel spécifique et de ses logiciels qui s'exécute dans ce qu'on appelle un hyperviseur. Si vous avez déjà utilisé un logiciel comme VirtualBox ou multipasse, alors vous avez utilisé un hyperviseur.

L'hyperviseur s'exécute généralement soit comme son propre système d'exploitation (appelé hyperviseur de type 1), soit dans les limites d'un autre système d'exploitation comme Windows ou Ubuntu (un hyperviseur de type 2). La responsabilité de l'hyperviseur est de présenter au système d'exploitation invité le matériel simulé dont il a besoin pour fonctionner. Le système d’exploitation complet peut alors fonctionner par-dessus. Cela inclut tout, depuis un processeur et une RAM simulés jusqu'aux bus de données, lecteurs de disque ou adaptateurs réseau. Cette simulation est coûteuse en calcul, de sorte que les machines virtuelles ont généralement une surcharge importante.

Alors, qu’est-ce qu’un conteneur?

Un conteneur est similaire à une machine virtuelle dans la mesure où il contient et exécute des logiciels dans un environnement isolé sur un système hôte. Cependant, les conteneurs remplacent la virtualisation matérielle traditionnelle en s'appuyant directement sur le système d'exploitation hôte. Les conteneurs partagent les bibliothèques et les binaires du système d'exploitation hôte et disposent uniquement des ressources et des dépendances nécessaires pour exécuter l'application spécifique qu'ils contiennent. Cela signifie qu'il n'est pas nécessaire d'avoir un système d'exploitation complet par conteneur, car tous les conteneurs exécutés sur un Le système peut partager le système d'exploitation hôte unique tout en conservant la ségrégation que vous obtenez avec le virtuel. Machines.

Les conteneurs accèdent au système d'exploitation hôte via un moteur de conteneur, qui gère les conteneurs en cours d'exécution et contrôle leur accès au système d'exploitation sous-jacent. Cela peut inclure le renforcement de la sécurité entre les conteneurs et l'octroi ou le refus de l'accès aux fichiers du système d'exploitation ou aux connexions réseau.

Quels sont les compromis liés à l’utilisation de conteneurs?

Bien que les machines virtuelles et les conteneurs soient similaires, l’utilisation de conteneurs présente néanmoins des inconvénients. D'une part, les machines virtuelles sont considérées comme plus sécurisées, car la surface d'attaque permettant de « s'échapper » de la machine virtuelle est nettement plus petite et plus difficile à pénétrer. Un conteneur peut ne pas être adapté pour tester des logiciels malveillants, par exemple.

Le principal avantage de l'utilisation de conteneurs est qu'ils sont légers, ce qui évite d'avoir à virtualiser l'intégralité d'un système d'exploitation, ce qui signifie des temps de démarrage minimaux et une réduction de la surcharge du système. Cela signifie que beaucoup plus de conteneurs peuvent s'exécuter sur un seul hôte, ce qui ne serait pas possible avec des machines virtuelles.

Étant donné que les conteneurs ne nécessitent pas de système d’exploitation complet, ils peuvent facilement être regroupés dans des images plus petites et distribués. Alors qu’une image complète d’une machine virtuelle peut facilement atteindre plusieurs dizaines de gigaoctets, les conteneurs peuvent se présenter sous forme d’images aussi petites que 15 Ko. Cela rend extrêmement facile la distribution et l’utilisation des conteneurs. Nous allons le démontrer en exécutant quelques exemples simples de conteneurs dans Docker.

Installation de Docker

Cela fait beaucoup de théorie, alors passons à la pratique. Pour vous montrer comment configurer un conteneur, nous allons installer Docker dans Ubuntu 23.10 et l'utiliser pour exécuter un simple conteneur Hello World. Nos étapes sont testées sur une machine virtuelle, mais vous pouvez également effectuer un double démarrage depuis votre PC Windows ou utiliser un excellent ordinateur portable pour Linux.

Docker est rapidement devenu l'outil de conteneurisation de facto. Bien que d'autres outils existent, Docker est largement adopté et convient parfaitement à toutes les applications, sauf les plus exigeantes. Il y a documentation sur les différentes manières d'installer Docker, mais nous utiliserons le script d'installation pratique. Cette commande téléchargera un script depuis get.docker.com sur votre ordinateur local :

$ curl -fsSL https://get.docker.com -o get-docker.sh

Vous pouvez ensuite exécuter ce script pour installer Docker. Vous pouvez vérifier que Docker est correctement installé en vérifiant la version avec :

$ sudo sh ./get-docker.sh

Suivi d'une vérification de version avec :

$ sudo docker version

Vous pouvez également vérifier que le service Docker s'exécute en arrière-plan avec :

$ sudo systemctl status docker

Il doit indiquer « actif (en cours d'exécution) » en texte vert, comme souligné dans la capture d'écran ci-dessous. La version du moteur Docker doit également être imprimée sans erreur.

Exécuter un exemple simple

Maintenant que Docker est installé, vous pouvez l'utiliser pour télécharger une image de conteneur. Les images de conteneurs ressemblent beaucoup aux ISO des machines virtuelles, sauf qu’elles sont généralement plus petites et plus faciles à créer. Téléchargez une simple image de conteneur hello-world avec la commande suivante :

$ sudo docker pull hello-world

Une fois cette image téléchargée, vous pouvez vérifier en répertoriant les images téléchargées sur votre système en utilisant les éléments suivants :

$ sudo docker images

Vous devriez maintenant voir hello-world téléchargé. Notez la très petite taille (13 Ko sur notre machine de test), ainsi que sa balise. La balise d’une image est effectivement sa version. Par défaut, Docker téléchargera la dernière version d'une image. Exécutez un conteneur basé sur cette image en utilisant :

$ sudo docker run hello-world: latest

Cela affichera le baratin hello-world de Dockers, qui s'exécute à partir d'un très petit programme C (que vous pouvez consulter sur GitHub).

Toutes nos félicitations; vous avez exécuté votre premier conteneur! Dans ce cas, le programme a généré son résultat et terminé son exécution. Le conteneur est désormais mort et ne fonctionne plus.

Comment garder les conteneurs en vie

Après avoir exécuté un conteneur de base, nous pouvons maintenant créer un exemple plus complexe qui ne se ferme pas immédiatement une fois la tâche terminée. Les conteneurs sont souvent construits autour d’un seul processus, ce qui peut engendrer plusieurs processus. Une fois ce processus de base terminé, tout le conteneur sortira avec lui. Cela peut ressembler à une limitation, mais c'est en fait très similaire au fonctionnement des systèmes d'initialisation dans le noyau Linux complet.

Pour exécuter un exemple persistant, nous pouvons extraire une image pour Nginx, qui est un serveur Web utilisé pour héberger un pourcentage important des sites Web dans le monde. Nous avons choisi Nginx pour cet exemple car il est simple, ne nécessite aucune configuration avancée et est léger. Téléchargez la dernière image Nginx avec la commande suivante :

$ sudo docker pull nginx

Nous avons ajouté le -p indicateur ici pour configurer la redirection de port du conteneur vers le système d’exploitation hôte. Le port 80 est utilisé pour le trafic HTTP (c'est-à-dire Web) non chiffré. Cela vous permettra d'accéder au conteneur depuis votre machine hôte :

$ sudo docker run -p 80:80 nginx

Cette commande s'exécutera dans votre terminal en mode attaché, ce qui signifie que le conteneur est littéralement attaché à votre terminal, donc tous les journaux du conteneur y seront imprimés. Une fois le conteneur démarré, ouvrez http://localhost dans votre navigateur Internet. Vous verrez un écran de bienvenue Nginx similaire à celui ci-dessous :

Le conteneur Nginx s'exécute désormais dans votre moteur de conteneur. Bien que Nginx s’exécute en mode attaché, il continuera à fonctionner tant qu’il sera ouvert. Vous pouvez quitter le conteneur Nginx en appuyant sur Ctrl+C dans votre terminal.

Comment exécuter des conteneurs en arrière-plan

Pour exécuter Nginx en arrière-plan, nous ajouterons un autre indicateur, -d, pour le mode détaché. Cela démarrera le conteneur détaché de votre terminal, ce qui signifie qu'il sera en arrière-plan. Par exemple:

$ sudo docker run -d -p 80:80 nginx

Vous pouvez répertorier les conteneurs en cours d'exécution sur un système. Remarquez comment votre conteneur Nginx s'exécute désormais en arrière-plan et s'est vu attribuer un identifiant.

$ sudo docker ps

Un conteneur en arrière-plan en cours d'exécution peut être supprimé à l'aide de son ID. Vous remarquerez peut-être également que le conteneur a reçu un nom. Lorsqu'aucun n'est spécifié, Docker donnera à chaque conteneur un nom aléatoire et unique.

$ sudo docker kill 

Cependant, vous pouvez tester cela avec des images plus intéressantes. Il y en a beaucoup disponibles au Centre Docker, qui fonctionne comme un référentiel central pour les images de conteneurs publics.

Plonger plus profondément avec des conteneurs

Ceci a été une brève introduction aux conteneurs. Les conteneurs peuvent être d’une complexité illimitée, mais ils constituent un élément fondamental des systèmes hautement distribués qui gèrent une grande partie de notre Internet moderne. Ce pouvoir n’empêche cependant pas leur utilisation à plus petite échelle. La familiarité avec les bases des conteneurs et de Docker peut être la passerelle vers l'exécution de services locaux utiles comme un serveur minecraft ou Plex sur un vieux PC.