---
title: Mapping de ports
description: Publier un port du conteneur vers l'hôte sans exposer toute la stack.
---

## Réseau interne et monde extérieur

Le réseau bridge est privé. Les services communiquent entre eux, mais le navigateur ou le terminal de l'hôte ne peut pas les joindre tant qu'aucun port n'est publié.

```yaml
services:
  nginx:
    ports:
      - "8080:80"
      - "8443:443"
```

La syntaxe est :

```text
PORT_HÔTE:PORT_CONTENEUR
```

`8443:443` redirige le port 8443 de la machine vers le port 443 écouté par Nginx dans le conteneur.

## Exposer uniquement le point d'entrée

Dans une stack classique, PostgreSQL, le backend et le frontend n'ont pas forcément de section `ports:`. Ils restent accessibles depuis le réseau Docker, mais pas depuis l'extérieur.

Seul Nginx publie un port. Il devient le point d'entrée et route ensuite les requêtes vers les services internes.

```text
navigateur
    │
    ▼
port publié de Nginx
    │
    ├──► frontend
    └──► backend ──► postgres
```

## Éviter les collisions

Le port interne d'un service reste le même, tandis que le port hôte peut changer :

```yaml
# Stack A
ports:
  - "8443:443"

# Stack B
ports:
  - "8444:443"
```

Ce principe permet à plusieurs workers de test de lancer la même stack sur des plages de ports différentes.

## Restreindre une publication à la machine

```yaml
services:
  postgres:
    ports:
      - "127.0.0.1:15432:5432"
```

Le préfixe `127.0.0.1` rend le port accessible depuis le serveur pour la maintenance, sans l'ouvrir sur l'adresse publique.

<Callout title="Principe de sécurité" type="warning">
  Ne publie pas une base de données sur toutes les interfaces sans nécessité. Sans le préfixe 127.0.0.1, un mapping comme 5432:5432 peut exposer PostgreSQL sur Internet si le pare-feu le permet.
</Callout>
