Docker pour développeurs : images, conteneurs et Compose
En tant que développeur, vous avez probablement été confronté à la frustration des incohérences d'environnement : « Ça marche sur ma machine ! » Docker résout ce problème en empaquetant les applications dans des conteneurs. Ce guide explique les images Docker, les conteneurs et Compose pour vous aider à construire, livrer et exécuter des applications de manière cohérente.
Qu'est-ce que Docker ?
Docker est une plateforme pour développer, livrer et exécuter des applications dans des conteneurs. Les conteneurs sont des paquets légers, autonomes et exécutables qui incluent tout ce qui est nécessaire pour exécuter un logiciel : code, runtime, outils système, bibliothèques et paramètres.
Images vs conteneurs
Une image est un modèle en lecture seule avec des instructions pour créer un conteneur. Un conteneur est une instance exécutable d'une image. Vous pouvez créer plusieurs conteneurs à partir de la même image, chacun isolé des autres.
Travailler avec les images
Les images sont construites à partir d'un Dockerfile, un fichier texte contenant des instructions. Voici un exemple simple avec Node.js :
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Construisez l'image avec :
docker build -t my-app .
Lister les images : docker images
Exécuter des conteneurs
Démarrez un conteneur à partir d'une image :
docker run -d -p 3000:3000 --name my-container my-app
Cela exécute le conteneur en mode détaché (-d), mappe le port 3000 et le nomme my-container.
Lister les conteneurs en cours d'exécution : docker ps
Arrêter un conteneur : docker stop my-container
Supprimer un conteneur : docker rm my-container
Pourquoi utiliser Docker Compose ?
Lorsque votre application dépend de plusieurs services (base de données, cache, etc.), gérer des conteneurs individuels devient fastidieux. Docker Compose vous permet de définir et d'exécuter des applications multi-conteneurs à l'aide d'un fichier YAML.
Exemple de fichier Compose
Créez 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:
Démarrez tous les services : docker compose up -d
Arrêter et supprimer : docker compose down
Bonnes pratiques pour les développeurs
- Utilisez .dockerignore : Excluez les fichiers inutiles (node_modules, .git) pour accélérer les builds.
- Builds multi-étapes : Gardez les images de production petites en séparant les étapes de build et d'exécution.
- Tirez parti du cache : Ordonnez les instructions du Dockerfile de la moins à la plus fréquemment modifiée.
- Étiquetez correctement les images : Évitez d'utiliser
latesten production ; utilisez le versionnage sémantique. - Scannez les vulnérabilités : Utilisez
docker scanpour vérifier les images à la recherche de problèmes connus.
Aide-mémoire des commandes courantes
| Commande | Description |
|---|---|
docker build -t name . | Construire une image à partir du Dockerfile |
docker run -p host:container image | Exécuter un conteneur et mapper les ports |
docker ps -a | Lister tous les conteneurs |
docker exec -it container bash | Ouvrir un shell dans un conteneur en cours d'exécution |
docker compose up | Démarrer les services définis dans le fichier Compose |
docker compose logs -f | Suivre les logs de tous les services |
FAQ
Quelle est la différence entre une image et un conteneur ?
Une image est un modèle statique ; un conteneur est une instance en cours d'exécution de cette image. Vous pouvez créer plusieurs conteneurs à partir d'une seule image.
Quand dois-je utiliser Docker Compose ?
Utilisez Compose lorsque votre application nécessite plusieurs services (par exemple, serveur web, base de données, cache) qui doivent s'exécuter ensemble. Cela simplifie l'orchestration pour le développement et les tests.
Comment persister des données dans Docker ?
Utilisez des volumes ou des bind mounts. Les volumes sont gérés par Docker et stockés dans une zone dédiée ; les bind mounts pointent vers un répertoire de l'hôte. Les deux survivent aux redémarrages des conteneurs.
Prêt à simplifier votre flux de travail Docker ? Essayez notre Analyseur de logs Nginx pour déboguer rapidement les logs de vos conteneurs.