# Le réseau

### Le réseau avec docker network

Docker permet une gestion avancée du réseau, entre un conteneur et la machine hôte, mais aussi entre les conteneurs.

Les réseaux docker peuvent être gérés avec la commande `docker network`.

```bash
docker network ls # lister les réseaux
docker network create mon_reseau # créer un réseau
docker network rm mon_reseau # supprimer un réseau
```

Il existe plusieurs types de réseaux docker, identifiés avec l'argument `--driver`.

- **Bridge (pont)**  
    Utilisé par défaut, c'est un réseau interne à docker.  
    Les conteneurs peuvent communiquer entre eux sur ce réseau.
- **Host**  
    Le conteneur partage directement le réseau de l'hôte. Il n'est pas isolé et utilise l'adresse IP de l'hôte. Dans ce cas, la redirection de port n'est pas nécessaire.
- **None**  
    Aucun réseau, isolation totale.

Docker propose par défaut un réseau pour chacun de ses 3 types.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/4ZJOZgHHOHTvj3ig-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/4ZJOZgHHOHTvj3ig-image.png)

Le réseau par défaut est `bridge`.

### Driver Bridge

Ci-dessous un exemple avec l'image `busybox` qui embarque quelques utilitaires réseau, dont la commande `ping`.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/bnb61iRsLe3PAIf0-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/bnb61iRsLe3PAIf0-image.png)

- Un réseau `testnetwork` est créé avec le driver `bridge`.
- Un conteneur `c1` est lancé en arrière-plan, il est attaché au réseau `testnetwork` avec `--network=testnetwork`.
- Un deuxième conteneur `c2` est lancé. Les deux conteneurs peuvent se pinguer.

<p class="callout info">Chaque conteneur est visible dans le réseau à partir de son nom défini avec `--name`.</p>

<p class="callout warning">Le réseau `bridge` par défaut de Docker isole les conteneurs entre-eux. Il est nécessaire de créer un autre réseau avec le driver `bridge` pour répéter l'expérience ci-dessus.</p>

Un conteneur situé en dehors du réseau `testnetwork` ne peut pas pinguer `c1` et `c2` :

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/603P8qQmJkNyr3EA-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/603P8qQmJkNyr3EA-image.png)

<div drawio-diagram="87"><img src="https://formation.tfrichet.fr/uploads/images/drawio/2025-09/YFaBS9YrYcENeDbR-drawing-3-1758184551.png" alt=""/></div>

### Driver Host

Un conteneur lancé avec le driver `host` n'est pas isolé du réseau de l'hôte. Les ports ouverts sur le conteneur sont ouverts sur l'hôte.

Par exemple, un conteneur lancé à partir de l'image [ 🔗 strm/helloworld-http](https://hub.docker.com/r/strm/helloworld-http/) écoutera à partir du port `80` de l'hôte, même sans redirection avec `--port`.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/qt82je0EU0HOofvt-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/qt82je0EU0HOofvt-image.png)

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/uV5H00pUEj3FAYry-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/uV5H00pUEj3FAYry-image.png)

<p class="callout info">Le nom d'hôte du conteneur est affiché. Il est hérité depuis la machine hôte.</p>

### Gestion des réseaux

Il est possible de connecter un conteneur à un réseau existant avec `docker network connect`.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/3bocO0a2nHDec8fi-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/3bocO0a2nHDec8fi-image.png)

Le détail d'un réseau peut être affiché avec la commande `docker network inspect`.

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/hhAvIiVSiofoxdGS-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/hhAvIiVSiofoxdGS-image.png)

Un réseau `bridge` embarque une configuration IP, de la même manière qu'un réseau local.  
Le réseau est défini par un `subnet` et il possède une IP `gateway` attribuée à la machine hôte.

Dans l'exemple ci-dessus, le réseau `reseau2` possède le subnet `172.19.0.0` avec un masque de sous-réseau `255.255.0.0` (ou `/16`).  
L'adresse IP de la machine hôte est `172.19.0.1` et celle du conteneur `c5` est `172.19.0.2`.