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")]
TermeDéfinition
ImageModèle figé (OS minimal + appli + dépendances)
ConteneurUne image en cours d’exécution (jetable)
VolumeStockage qui survit à la suppression du conteneur
Port publié-p 8080:80 = port 8080 de l’hôte → port 80 du conteneur
RegistreDépôt d’images (Docker Hub, Microsoft Container Registry, GitHub)
ComposeFichier 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 docker revient à être root sur la machine. Normal sur ton PC de dev, à éviter sur un serveur partagé.

3. Commandes essentielles

CommandeEffet
docker run -d --name web -p 8080:80 nginxLancer un conteneur en arrière-plan
docker ps / docker ps -aConteneurs actifs / tous
docker logs -f webJournaux en direct
docker exec -it web bashOuvrir un shell dans le conteneur
docker stop web / docker start webArrêter / relancer
docker rm -f webSupprimer (les données hors volume sont perdues)
docker images / docker rmi nginxImages locales / supprimer une image
docker pull mariadb:11Télécharger une image
docker volume lsVolumes
docker system df / docker system pruneEspace 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.0

C’est le même principe que les « eggs » de Pterodactyl, qui font tourner chaque serveur dans un conteneur Docker → O07 - Pterodactyl.

Voir aussi