Docker pour développeurs : images, conteneurs et Compose
Vous avez probablement entendu parler de Docker et de la façon dont il peut simplifier votre workflow de développement. Mais si vous débutez avec les conteneurs, la terminologie et les commandes peuvent sembler décourageantes. Ce guide va droit au but et vous donne une compréhension pratique des images Docker, des conteneurs et de Compose—pour que vous puissiez commencer à les utiliser efficacement dès aujourd'hui.
Qu'est-ce que Docker et pourquoi s'y intéresser ?
Docker est une plateforme qui empaquette votre application et ses dépendances dans une unité standardisée appelée conteneur. Les conteneurs sont légers, portables et isolés les uns des autres, ce qui signifie que vous pouvez exécuter votre application de manière cohérente sur votre ordinateur portable, la machine d'un collègue ou un serveur de production.
L'avantage principal ? « Ça marche sur ma machine » appartient au passé. Docker garantit que l'environnement dans lequel votre code s'exécute est identique partout.
Images vs conteneurs : les briques de base
Avant de commencer, vous devez comprendre la différence entre une image et un conteneur.
- Image : Un modèle en lecture seule qui contient le code de votre application, le runtime, les bibliothèques et les dépendances. Considérez-la comme un instantané ou un plan.
- Conteneur : Une instance exécutable d'une image. Vous pouvez démarrer, arrêter, déplacer et supprimer des conteneurs. Plusieurs conteneurs peuvent s'exécuter à partir de la même image.
En bref : une image est la recette, et un conteneur est le plat que vous cuisinez à partir de celle-ci.
Commandes Docker essentielles pour les développeurs
Voici les commandes que vous utiliserez le plus souvent :
docker pull <image>– Télécharger une image depuis un registre comme Docker Hub.docker images– Lister toutes les images locales.docker run <image>– Créer et démarrer un conteneur à partir d'une image.docker ps– Lister les conteneurs en cours d'exécution. Ajoutez-apour voir tous les conteneurs, y compris ceux qui sont arrêtés.docker stop <container>– Arrêter proprement un conteneur en cours d'exécution.docker rm <container>– Supprimer un conteneur arrêté.docker rmi <image>– Supprimer une image.docker exec -it <container> bash– Ouvrir un shell interactif à l'intérieur d'un conteneur en cours d'exécution.
Par exemple, pour exécuter un simple serveur web Nginx :
docker run -d -p 8080:80 nginx
Cela télécharge l'image nginx (si elle n'est pas déjà présente), démarre un conteneur en mode détaché (-d), et mappe le port 8080 de votre hôte vers le port 80 du conteneur (-p 8080:80).
Construire votre propre image avec un Dockerfile
Pour empaqueter votre application, vous créez un Dockerfile—un fichier texte contenant des instructions. Voici un exemple simple pour une application Node.js :
# Utiliser un runtime Node.js officiel comme image parente
FROM node:18-alpine
# Définir le répertoire de travail
WORKDIR /usr/src/app
# Copier package.json et installer les dépendances
COPY package*.json ./
RUN npm install
# Copier le reste du code de l'application
COPY . .
# Exposer le port sur lequel l'application s'exécute
EXPOSE 3000
# Définir la commande pour exécuter l'application
CMD ["node", "app.js"]
Construisez l'image avec :
docker build -t my-node-app .
Puis exécutez-la :
docker run -p 3000:3000 my-node-app
Simplifier les applications multi-conteneurs avec Docker Compose
Les applications réelles ont souvent besoin de plusieurs services : un serveur web, une base de données, un cache, etc. Les gérer individuellement avec docker run devient fastidieux. Docker Compose vous permet de définir et d'exécuter des applications multi-conteneurs à l'aide d'un fichier YAML.
Créez un fichier docker-compose.yml :
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Puis démarrez le tout avec :
docker compose up -d
Compose gère le réseau, les volumes et les dépendances pour vous. Pour arrêter et supprimer les conteneurs, réseaux et volumes, exécutez docker compose down.
Bonnes pratiques pour Docker en développement
- Utilisez .dockerignore : Excluez les fichiers inutiles (comme
node_modules) du contexte de build pour accélérer les builds. - Tirez parti des builds multi-étapes : Gardez votre image finale petite en séparant les dépendances de build du runtime.
- Épinglez les versions : Spécifiez des tags d'image exacts (par ex.,
node:18.16.0-alpine) pour la reproductibilité. - Exécutez en tant que non-root : Créez un utilisateur dans votre Dockerfile et basculez vers celui-ci avec
USERpour améliorer la sécurité. - Utilisez des volumes pour les données persistantes : Les bases de données et autres services avec état doivent stocker leurs données dans des volumes, pas à l'intérieur du conteneur.
Pièges courants et comment les éviter
- Images volumineuses : Partez d'une image de base minimale (comme Alpine) et nettoyez les caches de paquets.
- Conflits de ports : Assurez-vous que les ports de l'hôte ne sont pas déjà utilisés. Utilisez
docker pspour vérifier. - Ignorer les logs : Utilisez
docker logs <container>pour déboguer les problèmes. - Ne pas utiliser Compose pour le dev local : Même les applications simples bénéficient de la configuration déclarative de Compose.
FAQ
Quelle est la différence entre une image Docker et un conteneur ?
Une image est un modèle en lecture seule qui définit l'application et son environnement. Un conteneur est une instance en cours d'exécution de cette image. Vous pouvez créer de nombreux conteneurs à partir d'une seule image.
Ai-je besoin de Docker Compose pour une application mono-conteneur ?
Pas nécessairement. Pour les applications simples, docker run suffit. Cependant, Compose facilite la gestion des variables d'environnement, des volumes et du réseau, même pour un seul service, et simplifie la mise à l'échelle ultérieure.
Comment persister les données dans Docker ?
Utilisez des volumes. Les volumes sont stockés en dehors du système de fichiers du conteneur et persistent même si le conteneur est supprimé. Dans Compose, définissez un volume et montez-le sur un chemin dans le conteneur (par ex., volumes: - mydata:/var/lib/data).
Prêt à optimiser votre workflow Docker ? Lorsque vous devez analyser les logs de conteneurs, essayez notre Analyseur de logs Nginx pour parser et visualiser rapidement les données de logs—parfait pour déboguer des serveurs web conteneurisés.