72 lines
1.9 KiB
Plaintext
72 lines
1.9 KiB
Plaintext
---
|
|
title: Réseaux Docker
|
|
description: Relier les services avec un réseau privé et la résolution DNS interne.
|
|
---
|
|
|
|
## Des conteneurs isolés
|
|
|
|
Chaque conteneur possède sa propre pile réseau. Pour que le backend puisse joindre PostgreSQL et que Nginx puisse joindre le frontend, leurs conteneurs doivent partager un réseau.
|
|
|
|
## Réseau bridge et noms de services
|
|
|
|
Compose crée un réseau et y attache les services. Sur ce réseau, Docker fournit un DNS interne : chaque service est joignable avec son nom.
|
|
|
|
```yaml
|
|
networks:
|
|
app-network:
|
|
driver: bridge
|
|
|
|
services:
|
|
postgres:
|
|
networks:
|
|
- app-network
|
|
|
|
backend:
|
|
networks:
|
|
- app-network
|
|
environment:
|
|
POSTGRES_HOST: postgres
|
|
MINIO_HOST: minio
|
|
SMTP_HOST: mailpit
|
|
```
|
|
|
|
Le backend se connecte à la base avec l'hôte `postgres`. Docker résout ce nom vers l'adresse interne du conteneur correspondant.
|
|
|
|
Les adresses IP peuvent changer à chaque redémarrage ; les noms de services restent stables.
|
|
|
|
<Callout title="localhost reste local" type="warning">
|
|
À l'intérieur d'un conteneur, localhost désigne ce même conteneur. Pour joindre un autre service, utilise son nom Compose, jamais localhost.
|
|
</Callout>
|
|
|
|
## Isolation entre les stacks
|
|
|
|
Deux projets Compose distincts créent chacun leur réseau bridge. Leurs services ne se voient pas par défaut.
|
|
|
|
Cette isolation permet notamment de lancer plusieurs stacks de tests en parallèle sans qu'elles communiquent entre elles.
|
|
|
|
## Segmenter l'application
|
|
|
|
Un service peut appartenir à plusieurs réseaux. On peut ainsi exposer Nginx au réseau frontal tout en gardant PostgreSQL uniquement sur un réseau interne :
|
|
|
|
```yaml
|
|
networks:
|
|
public:
|
|
private:
|
|
|
|
services:
|
|
nginx:
|
|
networks:
|
|
- public
|
|
- private
|
|
|
|
backend:
|
|
networks:
|
|
- private
|
|
|
|
postgres:
|
|
networks:
|
|
- private
|
|
```
|
|
|
|
Seuls les services partageant un réseau peuvent communiquer directement.
|