Docker pour les développeurs : images, conteneurs et Compose
Vous êtes développeur et vous avez entendu parler de Docker. Peut-être l'avez-vous essayé, mais les concepts d'images, de conteneurs et de Compose restent flous. Ou vous en avez assez du « ça marche sur ma machine » et vous voulez un environnement cohérent. Ce guide va droit au but et vous donne une compréhension pratique des éléments essentiels de Docker et de leur utilisation efficace.
Pourquoi Docker pour les développeurs ?
Docker résout l'incohérence des environnements. Au lieu d'installer les dépendances directement sur votre machine, vous empaquetez votre application et ses dépendances dans un conteneur. Les conteneurs s'exécutent de la même manière partout : sur votre portable, celui de votre collègue et en production. Cela élimine les dérives de configuration et rend l'intégration triviale.
Les images : le plan de construction
Une image est un modèle en lecture seule. Elle contient le code de votre application, le runtime, les bibliothèques et les variables d'environnement. Vous construisez des images à partir d'un Dockerfile, un fichier texte contenant des instructions.
Voici un Dockerfile simple pour une application Node.js :
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Chaque instruction crée une couche. Les couches sont mises en cache, donc les reconstructions sont rapides lorsque seul le code change. Les images sont stockées dans des registres comme Docker Hub ou un registre privé.
Les conteneurs : l'instance en cours d'exécution
Un conteneur est une instance exécutable d'une image. Il est isolé mais partage le noyau de l'OS hôte, ce qui le rend léger. Vous démarrez un conteneur avec docker run.
docker run -p 3000:3000 -d my-app
Cela mappe le port 3000 de l'hôte vers le port 3000 du conteneur et l'exécute en mode détaché. Les conteneurs sont éphémères : les modifications sont perdues lors de leur suppression, sauf si vous utilisez des volumes.
Commandes clés :
docker ps– lister les conteneurs en cours d'exécutiondocker stop <container>– arrêter un conteneurdocker rm <container>– supprimer un conteneurdocker images– lister les imagesdocker rmi <image>– supprimer une image
Docker Compose : applications multi-conteneurs
Les applications réelles ont souvent besoin de plusieurs services : un serveur web, une base de données, un cache. Docker Compose vous permet de définir et d'exécuter des applications multi-conteneurs avec un seul fichier YAML.
Voici un docker-compose.yml pour une application Node.js avec PostgreSQL :
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Exécutez docker compose up pour démarrer les deux services. Compose gère la mise en réseau, donc web peut joindre db par le nom du service.
Quand utiliser Docker Compose ou Docker seul
| Scénario | Utilisation |
|---|---|
| Conteneur unique | docker run |
| Services multiples (app + DB) | Docker Compose |
| Orchestration en production | Kubernetes, Swarm |
Bonnes pratiques pour les développeurs
- Utilisez .dockerignore pour exclure node_modules, .git, etc., et accélérer les builds.
- Les builds multi-étapes pour garder des images finales légères.
- Figez les versions dans les instructions FROM pour la reproductibilité.
- Ne pas exécuter en root dans les conteneurs de production.
- Utilisez des volumes pour les données persistantes et le rechargement du code en direct pendant le développement.
Pièges courants
Conflits de ports : si le port 3000 est occupé, mappez vers un autre port hôte : -p 3001:3000.
Perte de données : sans volumes, les données de la base de données disparaissent lorsque le conteneur est supprimé.
Builds lents : ordonnez les instructions du Dockerfile du moins au plus fréquemment modifié pour tirer parti du cache.
FAQ
Quelle est la différence entre une image et un conteneur ?
Une image est un modèle en lecture seule ; un conteneur est une instance en cours d'exécution de cette image. Vous pouvez exécuter plusieurs conteneurs à partir de la même image.
Ai-je besoin de Docker Compose pour un seul service ?
Non. Compose brille lorsque vous avez plusieurs services. Pour un conteneur unique, docker run est plus simple.
Comment persister les données dans Docker ?
Utilisez des volumes. Définissez un volume nommé dans Compose ou utilisez -v avec docker run pour monter un répertoire hôte ou un volume nommé.
Prêt à fluidifier votre flux de travail Docker ? Découvrez notre JSON Formatter pour valider et formater rapidement des fichiers de configuration JSON comme docker-compose.yml ou package.json.