Docker
La plateforme de conteneurisation qui révolutionne le développement logiciel en simplifiant la création, le déploiement et l'exécution d'applications dans des environnements isolés.
Qu'est-ce que Docker ?
Imaginez que vous deviez déménager. Au lieu d'emballer chaque objet dans des cartons différents, puis de les transporter un par un, vous pourriez mettre toute votre maison dans un grand conteneur, le déplacer en une seule fois, et retrouver exactement la même configuration à l'arrivée.
Docker fonctionne selon ce principe pour les logiciels. Il permet de placer une application et tout ce dont elle a besoin pour fonctionner (bibliothèques, fichiers de configuration, etc.) dans un "conteneur" isolé, qui peut ensuite être déplacé et exécuté de manière identique sur n'importe quel ordinateur compatible avec Docker.
Pourquoi est-ce important ?
Cohérence
Docker résout le problème classique "Ça marche sur ma machine" en garantissant que l'application fonctionnera de manière identique partout.
Efficacité
Les conteneurs sont légers et rapides à démarrer, contrairement aux machines virtuelles traditionnelles qui nécessitent plus de ressources.
En résumé, Docker est comme un système d'emballage standardisé pour les logiciels, qui permet aux développeurs et aux équipes d'exploitation de créer, partager et exécuter des applications de manière cohérente et fiable, quel que soit l'environnement.
Fonctionnement technique
Docker est une plateforme open-source qui automatise le déploiement d'applications au sein de conteneurs. Contrairement aux machines virtuelles traditionnelles qui virtualisent un système d'exploitation complet, Docker utilise la virtualisation au niveau du système d'exploitation, permettant aux conteneurs de partager le même noyau Linux tout en restant isolés les uns des autres.
Les concepts fondamentaux
Images et Conteneurs
Les deux concepts les plus importants dans Docker sont:
- Image : Un package léger, autonome et exécutable qui inclut tout ce dont une application a besoin pour s'exécuter (code, runtime, bibliothèques, variables d'environnement, fichiers de configuration)
- Conteneur : Une instance en cours d'exécution d'une image Docker, isolée des autres conteneurs et du système hôte
Dockerfile
Un Dockerfile est un fichier texte qui contient toutes les instructions nécessaires pour construire une image Docker:
# Utilisation d'une image de base Node.js
FROM node:16-alpine
# Définition du répertoire de travail
WORKDIR /app
# Copie des fichiers package.json et package-lock.json
COPY package*.json ./
# Installation des dépendances
RUN npm ci --only=production
# Copie des fichiers sources de l'application
COPY . .
# Exposition du port sur lequel l'application s'exécute
EXPOSE 3000
# Définition des variables d'environnement
ENV NODE_ENV production
# Commande pour démarrer l'application
CMD ["npm", "start"]
Commandes Docker essentielles
Voici quelques commandes Docker couramment utilisées pour gérer des conteneurs et des images:
# Construction d'une image Docker
docker build -t my-webapp:latest .
# Liste des images disponibles
docker images
# Exécution d'un conteneur
docker run -d -p 3000:3000 --name webapp my-webapp:latest
# Liste des conteneurs en cours d'exécution
docker ps
# Logs d'un conteneur
docker logs webapp
# Exécution d'une commande dans un conteneur en cours d'exécution
docker exec -it webapp /bin/sh
# Arrêt d'un conteneur
docker stop webapp
# Suppression d'un conteneur
docker rm webapp
# Suppression d'une image
docker rmi my-webapp:latest
# Création d'un volume pour la persistance des données
docker volume create webapp-data
# Exécution d'un conteneur avec un volume
docker run -d -p 3000:3000 -v webapp-data:/app/data --name webapp my-webapp:latest
# Création d'un réseau Docker personnalisé
docker network create webapp-network
# Exécution d'un conteneur dans un réseau spécifique
docker run -d --network webapp-network --name webapp my-webapp:latest
# Publication d'une image sur Docker Hub
docker tag my-webapp:latest username/my-webapp:latest
docker push username/my-webapp:latest
Build multi-étapes
Le build multi-étapes permet de créer des images plus légères en séparant les étapes de construction et de production:
# Étape de build
FROM node:16-alpine AS build
# Définition du répertoire de travail
WORKDIR /app
# Copie des fichiers package.json et package-lock.json
COPY package*.json ./
# Installation des dépendances
RUN npm ci
# Copie des fichiers sources
COPY . .
# Construction de l'application
RUN npm run build
# Étape de production
FROM node:16-alpine
# Définition du répertoire de travail
WORKDIR /app
# Copie des fichiers package.json et package-lock.json
COPY package*.json ./
# Installation des dépendances de production uniquement
RUN npm ci --only=production
# Copie des fichiers de build depuis l'étape précédente
COPY --from=build /app/build ./build
COPY --from=build /app/public ./public
# Exposition du port
EXPOSE 3000
# Variables d'environnement
ENV NODE_ENV production
# Commande pour démarrer l'application
CMD ["npm", "start"]
Docker Compose
Docker Compose permet de définir et de gérer des applications multi-conteneurs:
version: '3.8'
services:
# Service pour l'application web
webapp:
build:
context: ./webapp
dockerfile: Dockerfile
image: my-webapp:latest
container_name: webapp
restart: unless-stopped
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
- DB_NAME=mydatabase
- DB_USER=myuser
- DB_PASSWORD=mypassword
volumes:
- webapp_data:/app/data
depends_on:
- db
networks:
- app_network
# Service pour la base de données
db:
image: postgres:14-alpine
container_name: postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
- POSTGRES_DB=mydatabase
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app_network
# Service pour le cache Redis
redis:
image: redis:alpine
container_name: redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- app_network
# Service pour le proxy inverse
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/certs:/etc/nginx/certs
- ./nginx/html:/usr/share/nginx/html
depends_on:
- webapp
networks:
- app_network
volumes:
webapp_data:
driver: local
postgres_data:
driver: local
redis_data:
driver: local
networks:
app_network:
driver: bridge
L'architecture Docker
Docker utilise une architecture client-serveur:
- Docker Daemon (dockerd) : Le service en arrière-plan qui gère la construction, l'exécution et la distribution des conteneurs Docker
- Client Docker : L'interface de ligne de commande (CLI) que les utilisateurs utilisent pour interagir avec Docker
- Docker Registry : Un service qui stocke les images Docker (Docker Hub est le registry public par défaut)
Fonctionnalités avancées
- Volumes : Mécanisme pour persister les données générées et utilisées par les conteneurs
- Réseaux : Différents types de réseaux pour connecter les conteneurs entre eux et avec l'extérieur
- Docker Swarm : Solution d'orchestration native pour gérer un cluster de nœuds Docker
- Docker BuildKit : Système de build nouvelle génération offrant de meilleures performances
- Docker Secrets : Gestion sécurisée des données sensibles comme les mots de passe et les clés API
- Docker Health Checks : Surveillance de l'état de santé des conteneurs
Bonnes pratiques
- Images légères : Utiliser des images de base minimales comme Alpine Linux
- Une préoccupation par conteneur : Chaque conteneur doit idéalement faire une seule chose
- Layers minimaux : Combiner les commandes RUN pour réduire le nombre de couches
- Ne pas utiliser de privilèges root : Créer et utiliser des utilisateurs non-root
- Utiliser .dockerignore : Exclure les fichiers non nécessaires lors du build
- Versions explicites : Spécifier des versions précises pour les images de base
- Images immuables : Traiter les conteneurs comme des entités immuables
Cas d'usage
Environnements de développement
Docker permet de standardiser les environnements de développement avec Docker Compose, assurant que tous les développeurs travaillent avec les mêmes versions de logiciels et dépendances.
Intégration et déploiement continus (CI/CD)
Les pipelines CI/CD comme GitHub Actions peuvent utiliser Docker pour construire, tester et déployer des applications de manière automatisée et reproductible.
Architectures microservices
Docker est idéal pour déployer des applications basées sur des microservices avec Node.js ou
PHP, où chaque service est conteneurisé et peut être développé, déployé et mis à l'échelle indépendamment.
Déploiement hybride et multi-cloud
Les conteneurs Docker peuvent être déployés de manière cohérente sur différents environnements: sur site, dans des clouds publics comme AWS ECS ou dans des configurations hybrides.
Industries qui utilisent Docker
Docker est largement adopté dans diverses industries pour moderniser les applications et optimiser les processus de développement: