Docker est une plateforme ouverte conçue pour simplifier le processus de développement, de livraison et d’exécution d’applications. Elle rationalise la livraison de logiciels grâce à la conteneurisation, une technologie qui regroupe votre application et ses dépendances dans des unités isolées et exécutables appelées conteneurs. Cela garantit que votre logiciel fonctionne de manière cohérente, quel que soit l’environnement.
Docker repose essentiellement sur plusieurs concepts clés : Docker Engine, Docker Hub, les images, les conteneurs, les Dockerfiles et Docker Compose. La compréhension de tous ces composants vous permet de créer, de déployer et de gérer des applications conteneurisées.
Vous pouvez utiliser et interagir avec Docker à l’aide de commandes, mais cette plateforme propose également une version de bureau avec une interface graphique. Leur processus de configuration est différent : vous pouvez configurer la version de bureau comme une application .dmg ou .exe classique, tandis que l’interface CLI nécessite une installation via un gestionnaire de paquets tel que APT ou Homebrew.
Lorsque vous utilisez l’écosystème Docker, diverses erreurs peuvent se produire à n’importe quel niveau, que ce soit sur l’image, le fichier Dockerfile ou le conteneur lui-même. Comme ces problèmes peuvent entraîner un dysfonctionnement de l’ensemble du système de conteneurisation, il est essentiel d’en savoir plus sur les problèmes courants, leurs causes et les solutions. Nous approfondirons ces questions après avoir exploré les concepts essentiels de Docker.
Qu’est-ce que la conteneurisation ?
La conteneurisation est une virtualisation au niveau du système d’exploitation qui regroupe des applications logicielles afin qu’elles s’exécutent dans des espaces utilisateur isolés appelés conteneurs.

Un conteneur regroupe une application avec tous ses composants nécessaires (code, bibliothèques système, dépendances et fichiers de configuration) afin de créer un environnement isolé.
Contrairement aux machines virtuelles (VM), les conteneurs sont légers car ils mutualisent le noyau du système d’exploitation commun du système hôte. Cette indépendance vis-à-vis de l’infrastructure sous-jacente permet aux applications de s’exécuter de manière cohérente dans différents environnements.
Les avantages de la conteneurisation sont les suivants :
- Portabilité. Les conteneurs s’exécutent de manière cohérente dans n’importe quel environnement, qu’il s’agisse d’une machine locale ou d’un serveur distant de fournisseurs tels que Hostinger. Cela élimine le problème courant des applications qui rencontrent des problèmes de compatibilité lorsqu’elles subissent un transfert vers différents systèmes lors du déploiement ou de la collaboration.
- Efficacité. Alors que les VM nécessitent un système d’exploitation invité complet et un hyperviseur, ce n’est pas le cas des conteneurs. Cette capacité en fait une forme de virtualisation plus légère et plus efficace.
- Isolement. Chaque conteneur exécute des processus isolés, avec son propre logiciel, sa propre configuration, sa propre pile réseau et ses propres variables d’environnement. Cela renforce la sécurité et évite les conflits entre les applications.
Pourquoi utiliser Docker ?
Vous devriez utiliser Docker car il offre un moyen fiable, efficace et standardisé de créer, mutualiser et exécuter des applications. Il résout plusieurs problèmes concrets liés au développement et au déploiement de logiciels :
- Le problème « mais ça marche sur ma machine ». Docker garantit qu’une application s’exécute exactement de la même manière pour chaque développeur et à chaque étape de la production, éliminant ainsi les bogues liés à l’environnement.
- Développement et déploiement rapides. Il simplifie le processus de création d’un environnement reproductible. Les développeurs peuvent intégrer des fonctionnalités telles que des cartes ou des passerelles de paiement sans avoir à les créer à partir de zéro, ce qui permet de gagner du temps.
- Évolutivité et portabilité. À l’aide d’outils tels que Docker Compose, vous pouvez définir une pile d’applications multi-conteneurs complexe dans un seul fichier et la partager facilement, ce qui garantit la cohérence entre les équipes et permet de faire évoluer les services selon les besoins.
- Efficacité des ressources. Les conteneurs étant légers et utilisant un noyau mutualisé du système d’exploitation hôte, ils nécessitent moins de ressources que les machines virtuelles traditionnelles.
Quels sont les concepts fondamentaux de Docker ?
Docker organise le concept de conteneurisation en un ensemble de composants fondamentaux interdépendants. Ces éléments fonctionnent ensemble comme une plateforme permettant de gérer l’ensemble du cycle de vie d’une application conteneurisée, depuis la création du plan initial jusqu’à l’exécution de l’application multiservice finale.
Docker Engine
Docker Engine est la technologie open source fondamentale pour créer et conteneuriser vos applications. Il utilise une architecture client-serveur pour gérer tous les objets Docker, tels que les images, les conteneurs et les réseaux.
Les trois principales composantes du moteur Docker sont les suivantes :
- Le serveur. Un processus démon à exécution longue (dockerd) qui gère toutes les tâches importantes, telles que la création, l’exécution et la destruction de conteneurs.
- Les API. Interfaces qui permettent aux programmes, y compris Docker CLI, de communiquer avec le démon et de lui donner des instructions.
- Le client CLI. L’outil en ligne de commande Docker, qui est le principal moyen pour les utilisateurs d’interagir avec la plateforme.
Pour mieux comprendre ce concept, imaginez le moteur Docker comme le chef, la cuisine et le serveur d’un restaurant.
- Le serveur (dockerd) est le chef qui prépare les plats, ou exécute le conteneur dans le contexte de Docker.
- Les API sont le menu et les bons de commande qui indiquent au chef ce qu’il doit préparer.
- La CLI Docker est le serveur qui prend vos commandes sous forme de commandes et transmet ces demandes à la cuisine.
Pour vérifier si votre moteur Docker fonctionne et est connecté au client, il suffit d’exécuter une commande pour voir s’il répond à votre demande. Par exemple, exécutez la commande suivante :
docker ps
Cette commande demande au Docker Daemon de lister tous les conteneurs actuellement en cours d’exécution. Si le moteur Docker fonctionne correctement, il devrait afficher une liste des conteneurs en cours d’exécution.
Docker Hub
Docker Hub est le registre Docker public par défaut, un service de stockage et de distribution d’images Docker. Il héberge des images officielles pour des logiciels populaires tels que nginx, node et python, et permet aux utilisateurs de créer des référentiels privés pour leurs images personnalisées.
Lorsque vous créez un conteneur, vous devez installer divers progiciels à partir d’images. Docker Hub simplifie le processus en vous permettant de télécharger des images à partir d’un référentiel centralisé.
Docker Hub utilise des balises pour étiqueter et identifier les images, qui désignent une version spécifique du paquet logiciel, telle que latest. Cela permet de maintenir la cohérence et la fonctionnalité des conteneurs dans différents environnements.
Considérez Docker Hub comme une bibliothèque communautaire de livres de recettes. Il stocke des recettes pré-écrites pour des plats courants que tout le monde peut télécharger et utiliser pour créer un repas. Vous pouvez également téléverser vos propres recettes pour les partager ou les conserver comme sauvegardes privées.
Vous pouvez interagir avec Docker Hub à l’aide de la commande Docker. Par exemple, utilisez la commande suivante pour télécharger une image à partir du registre :
docker pull <name>:<tag>
Par exemple, pour télécharger la dernière image officielle d’Ubuntu :
docker pull ubuntu:latest
Images Docker
Une image Docker est un template en lecture seule qui contient toutes les instructions et tous les fichiers nécessaires à la création d’un conteneur Docker. Elle regroupe le code de l’application, les fichiers de configuration, les bibliothèques système et les fichiers du système d’exploitation de base.
Les images sont construites à partir d’un fichier Dockerfile, où chaque instruction crée une couche distincte et immuable qui définit ce que l’image doit contenir ou faire.
En termes simples, une image est le plan d’une machine. Elle contient un ensemble d’instructions détaillant exactement ce que le produit final doit contenir, mais elle ne peut pas être modifiée une fois créée. Lorsque vous suivez le plan, vous créez un conteneur Docker.
Pour répertorier les images que vous avez téléchargées localement, utilisez :
docker images
Ensuite, la commande suivante crée un conteneur dans votre répertoire actuel à l’aide d’une image spécifique. Si l’image n’est pas déjà téléchargée, Docker la récupérera automatiquement depuis le Hub :
docker build -t nom-de-votre-image:latest .
La meilleure pratique lors de l’utilisation d’images consiste à utiliser une image de base minimale afin de réduire la taille et de minimiser la surface d’attaque potentielle généralement introduite par des paquets ou des composants inutiles.
Conteneurs Docker
Un conteneur est une instance exécutable d’une image. Il s’agit d’un espace isolé dans lequel votre application s’exécute, avec sa configuration, ses dépendances et les paquets logiciels requis.
Lorsque vous créez un conteneur Docker, une couche inscriptible est ajoutée au-dessus des couches en lecture seule de l’image, ce qui vous permet d’apporter des modifications aux fichiers dans son système de fichiers local.
Les conteneurs sont conçus pour être éphémères ou sans état, ce qui signifie qu’ils peuvent être arrêtés, détruits, reconstruits et remplacés avec une configuration minimale. Un conteneur individuel est géré avec l’interface CLI Docker, tandis que plusieurs conteneurs sont administrés à l’aide de Docker Compose ou d’un outil d’orchestration tel que Kubernetes.
En utilisant la même analogie, un conteneur est l’appareil ou la machine réelle en cours d’exécution, construite à partir du plan ou de l’image. Lorsque vous créez un conteneur Docker, vous assemblez et démarrez cette machine pour exécuter les processus définis dans l’image.
Pour créer un conteneur Docker et y exécuter une commande, il suffit d’utiliser la commande run :
docker run -it ubuntu /bin/bash
Cette commande exécute l’image Ubuntu, démarre un conteneur interactif et exécute le shell /bin/bash.
Dockerfiles
Un Dockerfile est un fichier texte brut qui contient une séquence d’instructions étape par étape pour créer une image Docker. Il définit tout, du système d’exploitation de base aux variables d’environnement et au code de l’application.

Voici quelques-unes des instructions clés les plus courantes dans un Dockerfile et leur objectif :
- FROM. Spécifie l’image de base pour une nouvelle étape de construction.
- RUN. Exécute des commandes pendant le processus de création de l’image.
- COPY ou ADD. Copie les fichiers du contexte de construction dans l’image.
- CMD ou ENTRYPOINT. Définit la commande qui s’exécute au démarrage du conteneur.
- ENV. Définit les variables d’environnement qui seront disponibles pendant la construction et lors de l’exécution.
- WORKDIR. Définit le répertoire de travail pour les instructions RUN, CMD, ENTRYPOINT, COPY et ADD suivantes.
Certaines instructions Dockerfile créent une couche, une étape dans le processus de création de l’image. Cependant, les instructions qui définissent la configuration ou les métadonnées, comme WORKDIR, ne le font pas.
Voici un exemple de ce à quoi ressemble un fichier Dockerfile :
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ("python", "app.py")
Docker Compose
Docker Compose est un outil qui simplifie la définition et la gestion d’applications multi-conteneurs à l’aide d’un seul fichier de configuration, généralement nommé docker-compose.yml.
Dans ce fichier de configuration, les développeurs peuvent définir tous les conteneurs, réseaux et volumes nécessaires à la création d’une pile d’applications complexe. Ils peuvent ensuite démarrer et gérer tous les conteneurs, également appelés services dans le contexte de Docker Compose, à l’aide d’une seule commande.
Sans Docker Compose, vous devrez configurer manuellement chaque conteneur dans votre image et les gérer individuellement à l’aide de l’interface CLI Docker. Si votre application comprend plusieurs services interconnectés, ce processus est fastidieux et prend beaucoup de temps.
Si un conteneur est un appareil unique, Docker Compose est le schéma de câblage d’une cuisine entière. Il définit comment le four, le réfrigérateur et le grille-pain sont tous connectés et mis sous tension ensemble à l’aide d’un seul interrupteur pour remplir leur fonction dans la cuisine.
Voici un exemple de fichier Docker Compose :
services:
web:
build: ./web # Construire l'image à partir de Dockerfile dans le répertoire ./web
ports:
- "8000:8000" # Mapper le port hôte 8000 au port conteneur 8000
depends_on:
- db # Attendre que le service db soit démarré
- redis # Attendre que le service redis soit démarré
db:
image: postgres:15 # Utiliser l'image officielle PostgreSQL 15
environment:
POSTGRES_USER: myuser # Définir le nom d'utilisateur de la base de données
POSTGRES_PASSWORD: mypassword # Définir le mot de passe de la base de données
POSTGRES_DB: mydb # Définir le nom initial de la base de données
volumes:
- db-data:/var/lib/postgresql/data # Conserver les données de la base de données à l'aide d'un volume nommé
redis:
image: redis:alpine # Utiliser une image Redis légère pour la mise en cache
volumes:
db-data: # Définir un volume nommé pour stocker les données de la base de données
Pour créer et démarrer tous les services définis dans votre fichier docker-compose.yml en arrière-plan, exécutez la commande avec le drapeau -d ou detached :
docker compose up -d
Il existe d’autres commandes docker compose qui vous permettent de gérer tous les conteneurs simultanément tout au long du cycle de vie de l’application. Pour en savoir plus à leur sujet, consultez notre tutoriel Qu’est-ce que Docker Compose.
Le processus d’installation de Docker diffère selon son type. Si vous utilisez Docker Desktop, vous pouvez simplement télécharger le package d’installation depuis la page officielle et le décompresser comme vous le feriez avec d’autres applications.
Par ailleurs, vous pouvez installer Docker CLI à l’aide de commandes via le gestionnaire de paquets de votre système, comme APT pour Ubuntu ou Homebrew pour macOS. Consultez la documentation officielle pour en savoir plus sur les commandes permettant de configurer Docker sur votre système d’exploitation.
Notez que Docker CLI ne comprend pas certaines fonctionnalités, telles que Docker Compose, ce qui signifie que vous devez l’installer séparément. Si vous utilisez la solution d’hébergement Docker de Hostinger, vous n’avez pas besoin de le configurer séparément, car notre fonctionnalité Docker Manager intégrée dispose d’une fonctionnalité Compose.

Comprendre les commandes Docker de base
Utilisez l’interface CLI Docker pour interagir avec Docker Engine et gérer vos conteneurs. Voici quelques-unes des commandes Docker les plus essentielles pour différentes tâches :
- docker ps -a. Répertorie tous les conteneurs, y compris ceux qui sont arrêtés.
- docker pull <nom>:<balise>. Télécharge une image depuis le registre vers votre machine locale.
- docker rmi <image>. Supprime une image locale.
- docker stop <conteneur>. Arrête en douceur un conteneur en cours d’exécution.
- docker rm <conteneur>. Supprime un conteneur.
Pour une référence complète des commandes les plus utilisées pour les images, les conteneurs, les volumes et plus encore, consultez notre cheat sheet Docker complet.
Les volumes sont le mécanisme privilégié et principal pour maintenir la persistance des données dans Docker, garantissant que les données restent accessibles même après la suppression d’un conteneur.
Ceci est important car, tout au long du cycle de vie du conteneur, vous pouvez être amené à le supprimer pour effectuer des mises à jour ou des opérations de maintenance. Si ce conteneur exécute des applications telles qu’une base de données où l’intégrité des données est essentielle, il est indispensable de configurer des volumes appropriés.
Docker propose trois types principaux de stockage :
- Volumes. Données persistantes de vos conteneurs dans la zone de stockage Docker, qui est généralement /var/lib/docker/volumes/ sur le système hôte.
- Bind mounts. Mappez un fichier ou un répertoire de la machine hôte directement dans le conteneur.
- tmpfs mounts. Stockez les données dans la mémoire de l’hôte, qui sont perdues lorsque le conteneur s’arrête.
Voici les étapes à suivre pour créer et gérer un volume pour les données persistantes :
- Créez un volume nommé à l’aide de la commande suivante. Par exemple, cela permettra de configurer un volume appelé my-database-data :
docker volume create my-database-data
- Démarrez votre conteneur de base de données en utilisant l’option -v pour mapper le volume nommé au répertoire de données interne du conteneur. La commande ressemble à ceci :
docker run -d \ --name my-database \ -e MYSQL_ROOT_PASSWORD=securepassword \ -v my-database-data:/var/lib/mysql \ mysql:latest
- Inspectez les détails et l’emplacement du volume sur l’hôte en exécutant :
docker volume inspect my-database-data
- Pour supprimer les volumes inutilisés qui ne sont attachés à aucun conteneur et libérer de l’espace disque, utilisez :
docker volume prune -a
Au lieu d’utiliser des commandes, vous pouvez déclarer et monter un volume en écrivant la configuration dans le fichier YAML de Docker Compose. Cela vous aide à suivre plus facilement les volumes utilisés par chaque conteneur, ce qui est utile lorsque vous avez plusieurs services.
Par exemple, la configuration YAML suivante couvre les étapes de création d’un volume et de montage d’un conteneur ci-dessus :
services:
my-database:
image: mysql:latest
container_name: my-database
environment:
MYSQL_ROOT_PASSWORD: securepassword
volumes:
- my-database-data:/var/lib/mysql
volumes:
my-database-data:
Les réseaux Docker maintiennent l’isolation et permettent la communication entre les conteneurs et les systèmes externes. Par défaut, les conteneurs sont connectés à un réseau pont. Pour configurer la communication pour une application multiservice, vous devez créer un réseau pont défini par l’utilisateur.
Les réseaux Docker permettent aux conteneurs de communiquer entre eux et avec des systèmes externes.
Par défaut, Docker connecte un conteneur à un réseau spécial appelé réseau pont par défaut, qui lui permet de communiquer avec l’hôte. Cependant, ce réseau pont par défaut n’est pas adapté aux configurations multi-conteneurs, car il offre des fonctionnalités limitées pour permettre aux services de se connecter les uns aux autres.
Pour les applications multiservices, la meilleure pratique consiste à créer un réseau pont défini par l’utilisateur qui permet aux conteneurs de communiquer entre eux à l’aide de leurs noms de service. Cela simplifie la découverte des services, améliore le contrôle de l’interaction entre les conteneurs et minimise les interférences entre les services.
Vous pouvez connecter un conteneur à un réseau pont défini par l’utilisateur en ajoutant la directive networks à la configuration du service dans le fichier YAML de Docker Compose. Voici un exemple :
services:
my-database:
image: mysql:latest
container_name: my-database
environment:
MYSQL_ROOT_PASSWORD: securepassword
volumes:
- my-database-data:/var/lib/mysql
networks:
- my-app-network #créer un réseau
Vous pouvez également créer un réseau pont défini par l’utilisateur à l’aide de la commande suivante, en lui donnant le nom my-app-network :
docker network create my-app-network
Vous pouvez ensuite démarrer votre conteneur à l’aide de l’interface CLI Docker avec l’option –name pour définir le nom du service et –network pour spécifier le réseau auquel il se connecte. Voici un exemple :
docker run -d \ --name my-database \ --network my-app-network \ -e MYSQL_ROOT_PASSWORD=securepassword \ -v my-database-data:/var/lib/mysql \ mysql:latest
Si vous souhaitez exécuter et vous connecter à un autre conteneur, répétez simplement la commande en mettant à jour les informations relatives au service. Dans l’exemple suivant, nous ajoutons un indicateur -p supplémentaire pour publier le port interne 80 du conteneur sur le port 8080 de la machine hôte afin de permettre un accès externe :
docker run -d \ --name my-webapp \ --network my-app-network \ -p 8080:80 \ my-web-app-image:latest
Dépannage des problèmes courants liés à Docker
Lorsque vous travaillez avec Docker, les points de défaillance courants concernent généralement le système en couches, notamment les images, les conteneurs, les volumes et les réseaux. Ci-dessous, nous allons détailler les problèmes récurrents et leurs solutions.
Le conteneur se ferme immédiatement
Les conteneurs peuvent s’arrêter immédiatement après leur démarrage parce que leur processus principal, défini par CMD ou ENTRYPOINT dans le fichier Dockerfile, termine son exécution ou plante. Une cause courante est que Docker Engine tente d’exécuter un service en arrière-plan sans utiliser le mode détaché.
Voici quelques solutions à cette erreur :
- Vérifiez les journaux. Utilisez docker logs <container_name> pour afficher les sorties stdout et stderr de l’application et identifier la raison du plantage.
- Inspectez les directives du fichier Dockerfile. Assurez-vous que le conteneur exécute un processus de longue durée en vérifiant si le fichier Dockerfile contient CMD ou ENTRYPOINT. Par exemple, un serveur web doit rester en fonctionnement pour répondre aux requêtes.
- Exécutez en mode détaché. Si l’application est un service à exécution longue et que vous souhaitez qu’elle s’exécute en arrière-plan, veillez à utiliser le drapeau -d ou –detach lorsque vous exécutez docker run ou docker compose run.
Problèmes de mise en cache des couches d’image
Si les modifications apportées à votre fichier Dockerfile (telles que la mise à jour d’une version de package) ne semblent pas prendre effet, vous rencontrez peut-être un problème avec la mise en cache des couches de Docker. Ce mécanisme réutilise les couches précédemment créées pour accélérer le processus de création d’images, plutôt que de les recréer à partir de zéro.
Bien que cela améliore l’efficacité, cela peut poser des problèmes lorsque des modifications sont apportées aux premières couches du fichier Dockerfile, car les instructions suivantes deviennent alors invalides.
La solution la plus simple à ce problème consiste à forcer une reconstruction complète et à ignorer le cache de couches. Pour ce faire, ajoutez l’option –no-cache lors du lancement du processus de construction, comme dans la commande suivante :
docker build --no-cache -t my-app:latest .
Lorsque vous installez des paquets à l’aide d’un fichier Dockerfile, incluez également explicitement une commande qui empêche le gestionnaire de paquets de réutiliser d’anciennes couches contenant des listes de paquets obsolètes. Dans les distributions basées sur Debian, vous pouvez y parvenir en combinant apt-get update et apt-get install -y –no-install-recommend dans la même instruction RUN, comme suit :
RUN apt-get update && apt-get install -y --no-install-recommends
Échec de l’authentification du registre
Si vous recevez une erreur du type « denied: requested access to the resource is denied » (refusé : l’accès à la ressource demandé est refusé) lorsque vous poussez une image vers un registre, tel que Docker Hub, cela signifie que le client CLI Docker n’a pas été authentifié auprès du serveur de registre.
La solution consiste à vous connecter et à authentifier votre compte auprès du registre. Voici les étapes à suivre :
- Connectez-vous au registre à l’aide de la commande suivante, où my-registry-example.com correspond à l’adresse réelle du registre. Si vous souhaitez transférer des images vers Docker Hub, vous pouvez omettre l’adresse :
docker login my-registry.example.com
- Entrez votre nom d’utilisateur et votre mot de passe lorsque vous y êtes invité.
- Marquez correctement l’image avec l’hôte du registre, le référentiel et la balise avant de la pousser à l’aide de cette commande :
docker tag my-local-image:latest my-registry.example.com/my-repo/my-local-image:latest
- Transférez l’image vers le registre en exécutant cette commande :
docker push my-registry.example.com/my-repo/my-local-image:latest
Quelles sont les prochaines étapes pour maîtriser Docker ?
Pour maîtriser Docker et l’utiliser dans des cas d’utilisation réels en production, vous devrez aller au-delà des bases de l’utilisation d’un seul conteneur et de commandes simples. Les étapes suivantes consistent à comprendre les techniques avancées de déploiement et de gestion d’applications complexes à haute disponibilité.
Outre Docker Compose, il est essentiel d’apprendre à utiliser des outils d’orchestration avancés tels que Docker Swarm ou Kubernetes pour gérer et faire évoluer plusieurs conteneurs sur un cluster de machines.
Approfondissez également vos connaissances sur les pilotes réseau, tels que le pilote réseau Overlay utilisé en mode Docker Swarm pour connecter des hôtes à travers un cluster. La connexion de plusieurs machines à l’aide du réseau par défaut de Docker est un processus complexe et manuel, tandis que les réseaux Overlay simplifient et automatisent la communication entre hôtes de manière évolutive et fiable.