V05 - Docker et Docker Compose
Objectif
Comprendre image / conteneur / volume / réseau, lancer des services en une commande (SQL Server, MariaDB, GLPI…) et décrire une pile complète avec Docker Compose.
1. Vocabulaire
flowchart LR DF["📄 Dockerfile<br/>(recette)"] -->|docker build| IMG[("📦 Image<br/>modèle en lecture seule")] HUB[("☁️ Registre<br/>Docker Hub, mcr.microsoft.com")] -->|docker pull| IMG IMG -->|docker run| C1["▶ Conteneur 1"] IMG -->|docker run| C2["▶ Conteneur 2"] C1 --- VOL[("💾 Volume<br/>données persistantes")]
| Terme | Définition |
|---|---|
| Image | Modèle figé (OS minimal + appli + dépendances) |
| Conteneur | Une image en cours d’exécution (jetable) |
| Volume | Stockage qui survit à la suppression du conteneur |
| Port publié | -p 8080:80 = port 8080 de l’hôte → port 80 du conteneur |
| Registre | Dépôt d’images (Docker Hub, Microsoft Container Registry, GitHub) |
| Compose | Fichier YAML décrivant plusieurs conteneurs liés |
2. Installation
# Pop!_OS / Ubuntu (paquets de la distribution, suffisants pour apprendre)
sudo apt install docker.io docker-compose-v2
# Arch
sudo pacman -S docker docker-compose
# Les deux :
sudo systemctl enable --now docker
sudo usermod -aG docker "$USER" # puis déconnexion/reconnexion (sinon "permission denied")
docker run hello-world # testÊtre dans le groupe
dockerrevient à être root sur la machine. Normal sur ton PC de dev, à éviter sur un serveur partagé.
3. Commandes essentielles
| Commande | Effet |
|---|---|
docker run -d --name web -p 8080:80 nginx | Lancer un conteneur en arrière-plan |
docker ps / docker ps -a | Conteneurs actifs / tous |
docker logs -f web | Journaux en direct |
docker exec -it web bash | Ouvrir un shell dans le conteneur |
docker stop web / docker start web | Arrêter / relancer |
docker rm -f web | Supprimer (les données hors volume sont perdues) |
docker images / docker rmi nginx | Images locales / supprimer une image |
docker pull mariadb:11 | Télécharger une image |
docker volume ls | Volumes |
docker system df / docker system prune | Espace utilisé / nettoyage |
4. SQL Server en conteneur (ce que tu utilises en cours)
Script : scripts/bdd/sqlserver_docker.sh
docker run -d --name sqlserver --hostname sqlserver \
-e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MotDePasse#Fort2026" \
-p 1433:1433 -v sqlserver_donnees:/var/opt/mssql \
mcr.microsoft.com/mssql/server:2022-latest
docker logs sqlserver | grep -i "ready for client"Détails, connexion et outils : B06 - SQL Server - installation et outils.
5. Docker Compose : une pile complète
Exemple : WordPress + MariaDB (l’équivalent conteneurisé du projet transversal) dans compose.yaml :
services:
bdd:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: change-moi-root
MARIADB_DATABASE: wordpress
MARIADB_USER: wpuser
MARIADB_PASSWORD: change-moi-wp
volumes:
- bdd_donnees:/var/lib/mysql
web:
image: wordpress:latest
restart: unless-stopped
depends_on:
- bdd
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: bdd # le NOM du service sert de nom DNS
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: change-moi-wp
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_fichiers:/var/www/html
volumes:
bdd_donnees:
wp_fichiers:docker compose up -d # tout démarrer → http://localhost:8080
docker compose ps
docker compose logs -f web
docker compose down # arrêter et supprimer les conteneurs (les volumes restent)
docker compose down -v # ... ET les volumes (données perdues)Les mots de passe ne devraient pas être en clair dans le fichier : mets-les dans un fichier
.env(non versionné) et écris${MARIADB_PASSWORD}dans le YAML.
6. Écrire sa propre image (ex. ton bot Discord)
Dockerfile :
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "bot.py"]docker build -t bot-discord:1.0 .
docker run -d --name bot --env-file .env --restart unless-stopped bot-discord:1.0C’est le même principe que les « eggs » de Pterodactyl, qui font tourner chaque serveur dans un conteneur Docker → O07 - Pterodactyl.