Maîtriser Docker sur Ubuntu : Guide de déploiement dans le monde réel

Si vous recherchez des informations sur la manière d’installer Docker sur Ubuntu, vous êtes au bon endroit. Non seulement cela, mais en bonus, ce tutoriel vous apprendra également comment exécuter les commandes de base de Docker pour exécuter et gérer des conteneurs.

En utilisant les fonctionnalités pratiques de Visual Studio (VS) Code, vous apprendrez également à renforcer vos compétences en SSH. Commençons !

Lié : Un utilisateur de Windows dans un monde Linux : VS Code et SSH à distance

Prérequis

Si vous souhaitez suivre pas à pas ce tutoriel, assurez-vous d’avoir ce qui suit :

  • A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
  • A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
  • L’extension officielle SSH de VSCode installée et connectée à votre installation de serveur Ubuntu LTS

Installation de Docker sur Ubuntu

Commençons par l’installation de Docker sur Ubuntu. À ce stade, le tutoriel suppose que vous êtes sur votre ordinateur Windows local avec VS Code ouvert et connecté à votre serveur Ubuntu via SSH. Apprenez comment configurer cet environnement pratique dans le dernier article sur l’utilisation de VS Code et SSH.

Dans l’exemple ci-dessous, VSCode est connecté à distance à Ubuntu avec le dossier home (dans ce cas, /home/homelab) ouvert en tant qu’espace de travail :

VSCode when SSHed into a Ubuntu Machine

Le processus réel d’installation de Docker sur Ubuntu Server est à deux commandes près. Ubuntu rend Docker disponible en tant qu’option d’installation dans le gestionnaire de paquets par défaut livré avec Ubuntu, appelé apt.

Dans la fenêtre du terminal SSH de VS Code, exécutez les deux commandes suivantes pour installer Docker :

sudo apt update -y
sudo apt install docker.io -y

Lors de l’installation d’Ubuntu Server, il se peut que vous ayez eu la possibilité d’installer Docker en tant que snap. Si c’est le cas, supprimez d’abord le package snap en exécutant la commande sudo snap remove docker

Vous pouvez observer l’installation de Docker dans l’animation ci-dessous :

The Installation Process for Docker on Ubuntu

Ubuntu est assez gentil pour activer automatiquement le service et le configurer pour qu’il démarre au démarrage, vous êtes donc prêt à utiliser Docker !

Création et exécution d’un conteneur Docker sur Ubuntu

Maintenant que vous avez installé Docker, que pouvez-vous en faire ? Commençons par la création d’un conteneur Docker. Ce tutoriel va configurer un serveur web statique comme bon exemple d’un conteneur Docker. Dans cette section, vous allez :

  • Configurer un nouveau conteneur à partir du référentiel d’images Docker Hub pour exécuter un service HTTP
  • Utiliser le mappage de port pour mapper le port HTTP à l’intérieur du conteneur sur votre hôte Ubuntu
  • Configurer les montages de liens pour mapper les données importantes à partir du conteneur vers votre hôte Ubuntu
  • Configurer la persistance à travers les redémarrages pour votre conteneur

Si l’une des étapes ci-dessus semble confuse, ne vous inquiétez pas, nous couvrirons chaque étape, une par une, pour vous aider à comprendre le processus.

Téléchargement de l’image Docker

La première question que vous devez vous poser est la suivante : d’où viendra ce conteneur ? Jetons un coup d’œil au Docker Hub.

A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.

A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.

Cette capture du système de fichiers rend Docker si populaire : le logiciel est capturé avec l’environnement d’exploitation complet. Cela élimine les problèmes liés aux différences entre les environnements de serveur.

L’un des référentiels les plus populaires (et par défaut) pour les images est le Docker Hub, également connu sous le nom de référentiel officiel Docker. Le référentiel d’images est l’endroit où vous pouvez télécharger des milliers d’images Docker pré-créées pour les exécuter en tant que conteneurs.

Étant donné que ce tutoriel configure un serveur web statique, vous devez télécharger une image de serveur web. Les deux serveurs web les plus populaires sont Apache httpd et Nginx, mais pour changer un peu les choses et peut-être vous faire découvrir un nouveau serveur web, utilisons un serveur appelé Caddy.

Caddy est un serveur web connu pour sa simplicité. De nombreuses configurations de serveur valides peuvent être déployées en utilisant une seule ligne dans un fichier. La simplicité est une bonne chose et constitue également un bon exemple de base.

  1. Tout d’abord, vous devrez trouver l’image Docker. Sur votre machine Windows, accédez à https://hub.docker.com.
  2. Effectuez une recherche pour caddy dans le coin supérieur gauche de la page. Vous devriez voir une page similaire à celle-ci :
Searching for caddy on the Docker Hub

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.

Vous devez faire attention pour vous assurer que l’image que vous choisissez provient d’une source fiable. N’importe qui peut placer des logiciels malveillants dans une image s’il le souhaite et télécharger sa version sur Docker Hub.

3. Notez le nom de l’image. Sur la capture d’écran ci-dessus, le nom est caddy exactement. Vous aurez besoin de ce nom pour spécifier le nom de l’image dans les prochaines étapes.

Exécution d’un conteneur avec Docker sur Ubuntu

Une fois que vous connaissez le nom de l’image que vous souhaitez télécharger, il est temps de la télécharger et de créer un conteneur à partir de celle-ci.

Démarrer un conteneur à partir d’une image nécessite une seule commande. Dans votre terminal SSH connecté à votre serveur Ubuntu, exécutez la commande docker run suivante.

La commande ci-dessous vérifie la présence de l’image caddy sur la machine locale. Si elle n’existe pas, elle télécharge l’image depuis Docker Hub, crée un conteneur et le démarre. La commande ci-dessous utilise l’option -p pour mapper le port d’écoute 80 du serveur Ubuntu sur le port 80 du conteneur. Cette fonctionnalité s’appelle le mappage de port.

sudo docker run -p 80:80 caddy

La plupart des images Docker Hub suivent une convention de nommage de la forme <utilisateur>/<nom de l’image>. Cependant, les images « officielles » de Docker n’ont pas d’utilisateur devant elles (comme caddy ci-dessus).

L’exécution de la commande ci-dessus produit une sortie comme suit, avec les informations de journalisation de Caddy affichées directement dans le terminal :

Running the Caddy Docker container

Vous remarquerez que presque toutes les commandes Docker commencent par sudo pour forcer l’exécution des commandes en tant qu’administrateur. Par défaut, le service Docker s’exécute en tant que root, et toutes les modifications que vous apportez aux conteneurs ou aux images doivent être effectuées en tant qu’administrateur.

Et voilà, vous êtes prêt à utiliser Docker ! C’est tout ce qu’il y a à faire. N’est-ce pas génial d’avoir installé Docker sur Ubuntu ?

Maintenant, accédez à http://<your-ip> sur votre ordinateur Windows et vous devriez voir une page d’accueil pour Caddy. Vous pouvez voir cela ci-dessous (l’adresse IP de ce guide est remplacée par http://homelab-docker) :

The default landing page for Caddy

Le conteneur caddy est maintenant en cours d’exécution, mais vous avez peut-être remarqué un problème. L’exécution de cette commande docker prend le contrôle de votre ligne de commande. Vous ne pouvez plus exécuter d’autres commandes et si la session se termine, le conteneur en cours d’exécution s’arrête. Résolvons ce problème en exécutant le conteneur en arrière-plan (également appelé détachement du conteneur).

Exécution des conteneurs Docker en arrière-plan

Vous avez maintenant un conteneur en cours d’exécution, mais votre ligne de commande est bloquée. Vous ne pouvez rien faire d’autre. Vous avez besoin d’une meilleure façon de démarrer un conteneur en l’exécutant en arrière-plan comme un service. Pour ce faire :

  1. Arrêtez le conteneur actuel en appuyant sur ctrl+c dans la ligne de commande. Cela devrait vous rendre votre ligne de commande.
  2. Maintenant, exécutez à nouveau la même commande que précédemment, mais cette fois avec le paramètre -d comme indiqué ci-dessous. Vous verrez que Docker renverra un ID de conteneur et vous renverra la ligne de commande.
sudo docker run -d -p 80:80 caddy
Running a detached container

Gestion des conteneurs en arrière-plan avec les commandes Docker

Une fois que vous avez un ou plusieurs Dockers en arrière-plan, vous devrez les gérer d’une manière ou d’une autre. Docker vous fournit plusieurs commandes différentes pour le faire en utilisant des commandes docker container.

  • sudo docker container list -a : Affiche tous les conteneurs (en cours d’exécution et arrêtés) et leur statut
  • sudo docker container stop <name> : Arrête un conteneur Docker par son nom (ou par son ID)
  • sudo docker container start <name> : Démarre un conteneur Docker par son nom (ou par son ID)
  • sudo docker container prune : Détruit et supprime tous les conteneurs arrêtés

Vous pouvez voir toutes les commandes ci-dessus utilisées dans le contexte dans la capture d’écran ci-dessous :

Managing detached containers using docker container commands

Il existe de nombreuses autres commandes de conteneur Docker permettant d’afficher, de modifier, d’inspecter ou même d’accéder à distance aux conteneurs sur votre serveur. Vous pouvez les afficher toutes en exécutant la commande sudo docker container --help.

Même si vous avez maintenant déployé un serveur web dans un conteneur en arrière-plan, vous n’avez toujours aucun moyen d’héberger votre contenu personnalisé. Tel quel, Caddy sert simplement la page web par défaut.

Jetons maintenant un coup d’œil à la façon dont vous pouvez utiliser les images Docker avec un concept appelé bind mounts pour déployer des conteneurs avec des données significatives.

Stockage des données du conteneur avec des bind mounts

Docker fonctionne sur le concept d’images (et des conteneurs qu’elles génèrent) comme étant jetables ou transitoires. S’il y a une mise à jour du logiciel Caddy, vous ne mettez pas à jour le service, vous jetez tout le bébé avec l’eau du bain et utilisez une image complètement neuve à partir de zéro.

Les avantages d’éliminer et de recréer des conteneurs de cette manière sont importants. Les instabilités du logiciel s’introduisent au fil du temps en mettant à jour continuellement un logiciel potentiellement vieux de plusieurs années. En utilisant une image fraîche à chaque fois, Docker vous fournit une base stable, fiable et (supposément) testée à chaque mise à jour.

Ce concept équivaut à utiliser une nouvelle installation de Windows à chaque fois que vous mettez à jour votre logiciel d’application Windows. Pas une idée amusante sur Windows, mais extrêmement applicable dans Docker.

La méthodologie jetable présente toutefois un problème évident. Vous ne voulez pas que les données essentielles soient jetées lorsque votre service actuel est supprimé. Docker résout ce problème en utilisant un concept appelé bind mounts.

Explorons maintenant comment créer un bind mount pour un conteneur.

Création de la structure du dossier et nettoyage

Avant de pouvoir utiliser les bind mounts, vous devez créer un emplacement pour stocker ces données. Ce tutoriel créera un dossier dans votre répertoire personnel. Pour ce faire dans VS Code tout en étant connecté à votre serveur Ubuntu :

  1. Cliquez avec le bouton droit de la souris dans une zone vide du panneau Explorer de VS Code et choisissez nouveau dossier.

2. Nommez le nouveau dossier containers/caddy/files.

Les noms des dossiers vous appartiennent tant qu’ils sont correctement définis dans la prochaine commande Docker. En utilisant un slash, VS Code interprète cela comme la création de trois dossiers. Le dossier files est un sous-répertoire de caddy, et caddy est un sous-répertoire de containers. Vous n’êtes pas obligé d’utiliser cette structure de dossier, mais la structure a plus de sens lorsque vous avez plusieurs conteneurs sur le même serveur.

Si ce n’est pas déjà fait, arrêtez et supprimez tous les conteneurs que vous avez précédemment créés avec la commande suivante:

# arrêtez et supprimez TOUS les conteneurs actuellement en cours d'exécution.
# La commande $(sudo docker ps -q) récupère dynamiquement tous les identifiants des conteneurs en cours d'exécution
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

Vous pouvez voir cette commande dans la capture d’écran ci-dessous:

Using the VSCode Explorer Window

Déploiement d’un conteneur Caddy avec des montages liés

Vous avez maintenant la structure de dossiers construite sur le serveur Ubuntu. Il est temps de créer un conteneur Caddy avec des montages liés.

  1. Avant d’aller plus loin, déterminez d’abord où le conteneur avec lequel vous travaillez stocke les données persistantes. Cet emplacement sera différent en fonction de la personne qui a créé l’image Docker et de l’objectif qu’elle sert.

Votre meilleure option pour trouver où les données persistantes sont stockées est de consulter la documentation dans le Docker Hub pour l’image en question. Pour Caddy, vous pouvez trouver la documentation ici:

The Caddy documentation on Docker Hub

2. Démarrez le conteneur en utilisant la commande suivante. Le paramètre -v ~/containers/caddy/files:/usr/share/caddy mappe le chemin avant les deux points (~/containers/caddy/files) vers le dossier à l’intérieur du conteneur (/usr/share/caddy). Cela fonctionne de manière très similaire à la commande de mappage de port : à la différence près que vous mappez un dossier au lieu d’un port. Ce type de commande s’appelle un Bind Mount.

# lie un dossier sur l'hôte (le chemin avant les deux points) à
# /usr/share/caddy à l'intérieur du conteneur
sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

le tilde (~) dans le code ci-dessus fait référence au dossier de l’utilisateur. Pour cet article, cela équivaut à /home/homelab.

3. Ouvrez un navigateur et accédez à nouveau à l’adresse http de votre serveur. Vous remarquerez que le serveur sert désormais une page 404. C’est normal car vous n’avez actuellement pas de fichier index.html dans le dossier ~/containers/caddy/files.

4. Créez un fichier index.html dans ~/containers/caddy/files sur le serveur Ubuntu dans la fenêtre de l’explorateur VS Code qui ressemble à ce qui suit :

<body><h2>hello world!</h2></body>

5. Accédez à l’adresse HTTP de votre serveur et confirmez que le conteneur sert désormais votre nouvelle page index.html.

Vous pouvez voir tout ce qui précède dans l’animation suivante :

container is now serving your new index.html page.

Contrairement aux commandes de gestion de Docker, les fichiers que vous créez (comme index.html) ne nécessitent pas de droits d’administration. Cela s’explique par le fait que vous êtes propriétaire du contenu que le serveur Caddy sert, car il se trouve dans votre dossier personnel.

Vérification du montage lié

Excellent ! Non seulement vous utilisez un conteneur Docker complètement neuf, mais ce conteneur sert également du contenu enregistré localement dans votre dossier personnel ! Vous pouvez le prouver en exécutant la commande suivante :

  1. Arrêtez et supprimez le conteneur en cours d’exécution. Cette étape supprime complètement tout, y compris ce fichier index.html si vous n’utilisiez pas de montage lié.
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Créez un tout nouveau conteneur.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

3. Vérifiez que le nouveau conteneur sert toujours le fichier index.html à l’adresse http://<votre serveur>.

Création de conteneurs Docker persistants

A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.

  1. Arrêtez et supprimez tous les conteneurs en cours d’exécution.
# arrêtez et supprimez TOUS les conteneurs en cours d'exécution
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Redémarrez le conteneur Caddy avec le paramètre --restart always, pour configurer ce nouveau conteneur pour démarrer avec l’hôte lors du redémarrage. Avec le drapeau --restart always en place, votre conteneur se comporte maintenant comme un service approprié : il démarre automatiquement au démarrage.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy --restart always caddy

3. Redémarrez le serveur.

4. Vérifiez maintenant que le nouveau conteneur démarre et sert toujours le fichier index.html à l’adresse http://<votre serveur>.

Vous pouvez voir les commandes suivantes appliquées ci-dessous :

Setting caddy to restart on boot

Passons à l’étape suivante

À ce stade, vous devriez disposer d’un environnement Docker fonctionnel et d’une compréhension de base des images et des conteneurs. Vous pouvez extraire, démarrer, arrêter et effectuer une gestion basique de vos conteneurs. Vous avez également créé avec succès un conteneur de service web en cours d’exécution en utilisant des montages liés et la cartographie de ports.

Il y a encore beaucoup de choses à couvrir concernant Docker : Restez à l’écoute de cet espace, car le prochain article abordera la gestion avancée de Docker à l’aide de Docker Compose.

Source:
https://adamtheautomator.com/docker-ubuntu/