Logo Docker

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.

Pour les non-initié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.

Pour les développeurs

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:

Dockerfile
# 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:

Commandes Docker de base
# 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:

Dockerfile multi-étapes
# É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:

docker-compose.yml
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
Applications concrètes

Cas d'usage

Environnements de développement

Docker permet de standardiser les environnements de développement avec Icône Docker ComposeDocker 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 Icône GitHub ActionsGitHub 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 Icône Node.jsNode.js ou Icône PHPPHP, 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 Icône AWS ECSAWS 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:

Finance
E-commerce
Santé
Éducation
Médias
Télécommunications
Logiciel
IoT