# docker-compose

## 📚 **Qu'est-ce que Docker Compose ?**

Docker Compose est un outil qui permet d'orchestrer plusieurs conteneurs Docker à partir d’un fichier YAML unique (`docker-compose.yml`). Il simplifie le déploiement, la configuration et la gestion des applications multi-conteneurs en définissant des **services** (chaque service correspondant à un conteneur spécifique), des **réseaux** (pour permettre aux conteneurs de communiquer entre eux) et des **volumes** (pour stocker des données de manière persistante, même si les conteneurs sont arrêtés ou recréés).

### ✨ **Avantages de Docker Compose :**

* Définition de l'infrastructure via un fichier unique.
* Gestion simplifiée des déploiements multi-conteneurs.
* Possibilité de reproduire facilement les environnements de développement, test ou production.

### 🌟 **Qu'est-ce qu'un Stack ?**

Un **stack** est un ensemble de **services** (conteneurs) qui travaillent ensemble pour constituer une application complète. Par exemple, un site WordPress nécessite deux services :

1. **Base de données MySQL** pour stocker les données.
2. **Serveur WordPress** pour gérer le contenu et l'affichage.

Ces services, bien que distincts, sont interdépendants. Un stack regroupe donc ces conteneurs, les configure et les connecte pour qu'ils fonctionnent ensemble de manière fluide.

#### 🧩 **Structure d’un Stack :**

{% code title="docker-compose.yml" %}

```yaml
services:
  db:
    image: mysql:5.7
  wordpress:
    image: wordpress:latest
    depends_on:
      - db
```

{% endcode %}

* **`services`** : Déclare les services du stack.
* **`db`** : Conteneur pour la base de données MySQL.
* **`wordpress`** : Conteneur pour le serveur WordPress, dépendant de `db`.

***

## 📥 **Installation de Docker Compose**

```bash
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

#### 🧪 **Vérifiez l'installation :**

```bash
docker-compose --version
```

***

## 🛠️ **Commandes de Base de Docker Compose**

<table data-header-hidden><thead><tr><th width="295"></th><th></th></tr></thead><tbody><tr><td><strong>Commande</strong></td><td><strong>Description</strong></td></tr><tr><td><code>docker-compose up -d</code></td><td>Lance les services en arrière-plan</td></tr><tr><td><code>docker-compose ps</code></td><td>Affiche le statut des conteneurs</td></tr><tr><td><code>docker-compose logs -f</code></td><td>Montre les logs des services en temps réel</td></tr><tr><td><code>docker-compose stop</code></td><td>Arrête les conteneurs sans les supprimer</td></tr><tr><td><code>docker-compose down</code></td><td>Arrête et supprime les conteneurs, réseaux et volumes associés</td></tr><tr><td><code>docker-compose config</code></td><td>Valide la syntaxe du fichier <code>docker-compose.yml</code></td></tr></tbody></table>

### 🌟 **Comparaison Docker vs Docker Compose**

| Fonctionnalité                 | Commande Docker | Commande Docker Compose |
| ------------------------------ | --------------- | ----------------------- |
| Télécharger une image          | `docker pull`   | `docker-compose pull`   |
| Lancer un conteneur/service    | `docker run`    | `docker-compose up`     |
| Voir les conteneurs actifs     | `docker ps`     | `docker-compose ps`     |
| Afficher les logs              | `docker logs`   | `docker-compose logs`   |
| Arrêter un conteneur/service   | `docker stop`   | `docker-compose stop`   |
| Supprimer un conteneur/service | `docker rm`     | `docker-compose down`   |

***

## 🚀 **Démarrer un Stack Docker Compose**

{% stepper %}
{% step %}

## **Créer le fichier `docker-compose.yml`**

Créez un fichier `docker-compose.yml` à la racine de votre projet avec le contenu suivant :

{% code title="docker-compose.yml" %}

```yaml
services:
  db:
    image: mysql:5.7
    volumes:
      - /data/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
```

{% endcode %}

* **`image`** : Définit l'image Docker à utiliser pour le conteneur.
* **`volumes`** : Permet de persister les données en les sauvegardant sur la machine hôte.
* **`restart: always`** : Redémarre automatiquement le conteneur en cas de panne.
* **`environment`** : Définit les variables d'environnement utilisées par les services.
* **`depends_on`** : Assure que le conteneur `db` démarre avant `wordpress`.
* **`ports`** : Expose le port 80 du conteneur WordPress sur le port 8000 de la machine hôte.
  {% endstep %}

{% step %}

### **Lancer la stack**

{% stepper %}
{% step %}
**Démarrez les conteneurs** :

```bash
docker-compose up -d
```

✅ Cela démarre MySQL et WordPress en arrière-plan.
{% endstep %}

{% step %}
**Vérifiez le statut des conteneurs** :

```bash
docker-compose ps
```

Vous devriez voir les conteneurs `db` et `wordpress` en état `running`.
{% endstep %}
{% endstepper %}
{% endstep %}

{% step %}

### **Accéder à votre site**

Rendez-vous sur [http://\<IP>:8000](http://localhost:8000) pour finaliser la configuration de votre site WordPress.
{% endstep %}

{% step %}

### **Arrêter et gérer la stack**

* **Arrêter les conteneurs** :

  ```bash
  docker-compose stop
  ```
* **Supprimer les conteneurs et les volumes** :

  ```bash
  docker-compose down -v
  ```

{% endstep %}
{% endstepper %}

***

## ✅ **Commandes Essentielles**

| Commande                 | Description                               |
| ------------------------ | ----------------------------------------- |
| `docker-compose up -d`   | Démarre tous les services en arrière-plan |
| `docker-compose ps`      | Affiche le statut des conteneurs          |
| `docker-compose logs -f` | Affiche les logs en temps réel            |
| `docker-compose stop`    | Stoppe les conteneurs                     |
| `docker-compose down -v` | Supprime les conteneurs et les volumes    |
| `docker-compose config`  | Valide la syntaxe du fichier              |

***

## 📖 **Récapitulatif des éléments**

#### Fichier `docker-compose.yml` :

* **Services** : `db` (MySQL) & `wordpress`
* **Volumes** : Persistances des données MySQL
* **Ports** : Exposition du port `8000` pour WordPress
* **Environnements** : Configuration des bases de données

***

## 📌 **Concepts Clés**

### 🔗 **Service**

Un **service** est une définition d’un conteneur Docker avec sa configuration. Chaque service correspond à un composant de votre application (par exemple, MySQL ou WordPress).

### 📂 **Volume**

Les **volumes** permettent de **stocker des données persistantes** hors des conteneurs. Ainsi, vos données restent intactes même si les conteneurs sont recréés.

### 🌐 **Réseau**

Un réseau Docker est automatiquement créé par Docker Compose pour permettre aux services de **communiquer entre eux**.

### 🔄 **Redémarrage Automatique**

L’option `restart: always` dans `docker-compose.yml` redémarre un conteneur automatiquement en cas de panne.
