Bienvenue dans ce guide complet sur Docker ! Si vous débutez ou souhaitez approfondir vos connaissances sur les conteneurs, cet article est fait pour vous. Docker est une plateforme open source qui permet de développer, livrer et exécuter des applications dans des conteneurs légers et portables. Voici un aperçu détaillé de ses fonctionnalités, de ses commandes essentielles, et de bonnes pratiques pour une utilisation optimale.
Dans ce guide, vous découvrirez :
- Les concepts fondamentaux de Docker, comme les images, les conteneurs, les volumes et les réseaux.
- Comment installer Docker sur différents systèmes d'exploitation (Linux, Windows, macOS).
- Les commandes essentielles pour gérer les images, les conteneurs, les volumes et les réseaux.
- Un exemple pratique pour déployer une application web avec Docker et Docker Compose.
- Les bonnes pratiques pour optimiser vos conteneurs, sécuriser vos applications et surveiller vos déploiements.
2. Installation de Docker
Pour commencer avec Docker, vous devez l'installer sur votre machine. Voici comment procéder selon votre système d'exploitation :
2.1. Installation sur Linux
La plupart des distributions Linux prennent en charge Docker. Voici les étapes pour installer Docker sur une distribution basée sur Debian (comme Ubuntu) :
# Mettre à jour la liste des paquets
sudo apt-get update
# Installer les dépendances nécessaires
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Ajouter la clé GPG officielle de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Ajouter le dépôt Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Mettre à jour à nouveau la liste des paquets
sudo apt-get update
# Installer Docker
sudo apt-get install -y docker-ce
# Vérifier que Docker est bien installé
sudo docker --version
2.2. Installation sur Windows
Pour installer Docker sur Windows, vous devez utiliser Docker Desktop :
- Téléchargez Docker Desktop depuis le site officiel.
- Exécutez le fichier d'installation et suivez les instructions.
- Une fois l'installation terminée, lancez Docker Desktop depuis le menu Démarrer.
- Assurez-vous que Docker Desktop est en cours d'exécution en vérifiant l'icône Docker dans la barre des tâches.
2.3. Installation sur macOS
Pour installer Docker sur macOS, utilisez également Docker Desktop :
- Téléchargez Docker Desktop depuis le site officiel.
- Ouvrez le fichier DMG téléchargé et glissez Docker dans le dossier Applications.
- Lancez Docker depuis le dossier Applications.
- Suivez les instructions pour terminer l'installation.
---
3. Concepts de Base de Docker
Avant de plonger dans les commandes, il est essentiel de comprendre quelques concepts clés :
3.1. Images
Une image Docker est un modèle immuable utilisé pour créer des conteneurs. Elle contient tout ce qui est nécessaire pour exécuter une application : le code, les bibliothèques, les variables d'environnement, etc. Les images sont stockées dans des registres, comme Docker Hub, qui est le registre public par défaut.
Exemple de commande pour télécharger une image depuis Docker Hub :
docker pull nginx
3.2. Conteneurs
Un conteneur est une instance exécutable d'une image. Il est isolé des autres conteneurs et du système hôte. Vous pouvez créer, démarrer, arrêter et supprimer des conteneurs.
Exemple de commande pour créer et démarrer un conteneur à partir d'une image :
docker run -d -p 8080:80 --name mon-nginx nginx
3.3. Dockerfile
Un Dockerfile est un fichier texte qui contient une série d'instructions pour construire une image Docker. Il permet de définir l'environnement, d'installer des dépendances et de configurer l'application.
Exemple de Dockerfile simple :
# Utiliser une image de base
FROM ubuntu:20.04
# Mettre à jour les paquets
RUN apt-get update && apt-get upgrade -y
# Installer un package
RUN apt-get install -y nginx
# Copier un fichier dans le conteneur
COPY index.html /var/www/html/
# Exposer un port
EXPOSE 80
# Démarrer le serveur web
CMD ["nginx", "-g", "daemon off;"]
3.4. Volumes
Les volumes permettent de persister les données générées par un conteneur. Ils sont stockés sur l'hôte et peuvent être partagés entre plusieurs conteneurs.
Exemple de commande pour créer un volume et l'utiliser dans un conteneur :
docker volume create mon-volume
docker run -d -v mon-volume:/data --name mon-conteneur mon-image
3.5. Réseaux
Docker permet de créer des réseaux personnalisés pour isoler les conteneurs ou les connecter entre eux. Cela est particulièrement utile pour les applications multi-conteneurs.
Exemple de commande pour créer un réseau :
docker network create mon-reseau
---
4. Commandes Docker Essentielles
Voici une liste des commandes Docker les plus utilisées, classées par catégorie :
4.1. Gestion des Images
- docker pull <nom_image> : Télécharger une image depuis un registre.
- docker images : Lister les images locales.
- docker rmi <id_image> : Supprimer une image.
- docker build -t <nom_image> . : Construire une image à partir d'un Dockerfile.
- docker push <nom_image> : Envoyer une image vers un registre.
4.2. Gestion des Conteneurs
- docker run <options> <nom_image> : Créer et démarrer un conteneur.
- docker ps : Lister les conteneurs en cours d'exécution.
- docker ps -a : Lister tous les conteneurs (y compris ceux arrêtés).
- docker stop <id_conteneur> : Arrêter un conteneur.
- docker start <id_conteneur> : Démarrer un conteneur arrêté.
- docker restart <id_conteneur> : Redémarrer un conteneur.
- docker rm <id_conteneur> : Supprimer un conteneur.
- docker logs <id_conteneur> : Afficher les logs d'un conteneur.
- docker exec -it <id_conteneur> /bin/bash : Ouvrir un shell dans un conteneur en cours d'exécution.
4.3. Gestion des Volumes
- docker volume create <nom_volume> : Créer un volume.
- docker volume ls : Lister les volumes.
- docker volume rm <nom_volume> : Supprimer un volume.
4.4. Gestion des Réseaux
- docker network create <nom_reseau> : Créer un réseau.
- docker network ls : Lister les réseaux.
- docker network rm <nom_reseau> : Supprimer un réseau.
- docker network inspect <nom_reseau> : Afficher les détails d'un réseau.
---
5. Exemple Pratique : Déployer une Application Web avec Docker
Dans cette section, nous allons déployer une application web simple en utilisant Docker. Nous allons utiliser une application Node.js avec une base de données Redis.
5.1. Préparer l'Application
Supposons que vous avez une application Node.js simple avec le code suivant (app.js) :
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis',
port: 6379
});
app.get('/', (req, res) => {
client.incr('counter', (err, counter) => {
if (err) throw err;
res.send('Nombre de visites : ' + counter);
});
});
app.listen(3000, () => {
console.log('Serveur démarré sur le port 3000');
});
Et un fichier package.json pour gérer les dépendances :
{
"name": "app-express-redis",
"version": "1.0.0",
"description": "Une application simple avec Express et Redis",
"main": "app.js",
"dependencies": {
"express": "^4.17.1",
"redis": "^3.1.2"
},
"scripts": {
"start": "node app.js"
}
}
5.2. Créer un Dockerfile pour l'Application Node.js
Créez un fichier Dockerfile dans le répertoire de votre application :
# Utiliser une image de base Node.js
FROM node:14
# Définir le répertoire de travail
WORKDIR /usr/src/app
# Copier les fichiers package.json et package-lock.json
COPY package*.json ./
# Installer les dépendances
RUN npm install
# Copier le reste du code
COPY . .
# Exposer le port 3000
EXPOSE 3000
# Démarrer l'application
CMD ["npm", "start"]
5.3. Créer un Dockerfile pour Redis
Redis est disponible en tant qu'image officielle sur Docker Hub. Vous n'avez donc pas besoin de créer un Dockerfile pour Redis. Vous pouvez simplement utiliser l'image officielle :
docker pull redis
5.4. Créer un Fichier docker-compose.yml
Pour simplifier le déploiement, nous allons utiliser Docker Compose. Créez un fichier docker-compose.yml :
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- redis
redis:
image: "redis:alpine"
5.5. Démarrer les Services
Ouvrez un terminal dans le répertoire contenant le fichier docker-compose.yml et exécutez :
docker-compose up -d
Cette commande va construire l'image pour votre application Node.js, télécharger l'image Redis, et démarrer les deux services en arrière-plan.
5.6. Tester l'Application
Ouvrez votre navigateur et accédez à l'URL suivante :
Vous devriez voir le nombre de visites augmenter à chaque rafraîchissement de la page.
5.7. Arrêter les Services
Pour arrêter les services, exécutez :
docker-compose down
---
6. Bonnes Pratiques avec Docker
Pour tirer le meilleur parti de Docker, voici quelques bonnes pratiques à suivre :
6.1. Optimiser les Images Docker
- Utiliser des images légères : Privilégiez les images basées sur Alpine Linux ou utilisez
--squashpour réduire la taille des images. - Multi-stage builds : Utilisez des builds multi-étapes pour réduire la taille finale de l'image en ne gardant que les fichiers nécessaires.
- Éviter de faire tourner des processus root : Exécutez les conteneurs avec un utilisateur non privilégié pour des raisons de sécurité.
6.2. Gestion des Secrets
Ne stockez pas de secrets (comme des mots de passe ou des clés API) directement dans vos images ou conteneurs. Utilisez plutôt :
- Les secrets Docker :
docker secretpour les swarms. - Les variables d'environnement : Passez des secrets via des variables d'environnement au démarrage du conteneur.
- Les outils externes : Comme HashiCorp Vault ou AWS Secrets Manager.
6.3. Surveillance et Journalisation
- Utiliser des outils de surveillance : Comme Prometheus, Grafana ou cAdvisor pour surveiller les performances de vos conteneurs.
- Centraliser les logs : Utilisez des outils comme ELK Stack (Elasticsearch, Logstash, Kibana) ou Fluentd pour collecter et analyser les logs de vos conteneurs.
