1.2 · Lancer des conteneurs : ports, noms, modes, variables

Niveau 1 · Conteneurs : images, volumes, réseaux

1.2Lancer des conteneurs : ports, noms, modes, variables

Objectif : démarrer n'importe quel service du Hub en exposant ports et configuration.
Temps estimé : 13 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • Publier un port = la porte d'entrée : -p 8080:80 relie le port 8080 de la machine au port 80 du conteneur — gauche = hôte, droite = conteneur ; sans publication, le service reste invisible.
  • Détaché ou interactif, deux régimes : les services tournent en -d (fond), les outils ponctuels en -it (terminal attaché) — un serveur en -it bloque le terminal.
  • Configurer sans reconstruire : -e CLÉ=valeur pilote les images officielles et --name donne une identité stable pour viser le conteneur (logs, exec, stop).

Mini-cas filé — Idir lance la stack de test

Idir doit montrer l'application à son responsable : une base Postgres et un frontal Nginx sur sa machine. Il lance la base en détaché, nommée bdd, avec le mot de passe passé en -e — sans publier son port, inutile pour une démo locale. Puis il lance le web nommé web avec -p 8080:80 et ouvre http://localhost:8080 : la page s'affiche. Quand son responsable demande « c'est quel conteneur, la base ? », Idir répond « bdd » — un nom, pas un identifiant hexadécimal.

Suite du cas 1.1 — Idir passe des images choisies aux conteneurs lancés.

1. Publier un port : la porte d'entrée

Un conteneur vit dans son réseau isolé : sans publication, son port 80 est invisible depuis la machine. -p 8080:80 relie le port 8080 de la machine au port 80 du conteneur. La règle : gauche = hôte, droite = conteneur. Deux conteneurs peuvent exposer le même port interne avec des ports hôtes différents.

On ne publie que ce qui doit être joint de l'extérieur : le frontal web oui, la base de données non (elle restera joignable en interne, section 1.4).

2. Détaché ou interactif : deux régimes

Les services tournent en détaché (-d, en fond). Les outils ponctuels tournent en interactif (-it, terminal attaché : docker run -it --rm ubuntu:24.04 bash). On ne mélange pas : un serveur en -it bloque le terminal, un shell en -d est inutilisable.

Le réflexe : « est-ce un service qui doit tourner seul ? -d. Est-ce un outil dont j'ai besoin du clavier ? -it. »

3. Configurer sans reconstruire : -e et --name

Les images officielles se pilotent par variables d'environnement (-e POSTGRES_PASSWORD=secret) : pas besoin de reconstruire une image pour changer un mot de passe. --name donne une identité stable pour viser le conteneur (logs, exec, stop).

Nom + variables + ports : 90 % des lancements tiennent en une ligne. Les variables sont figées à la création : pour en changer, on supprime et on relance.

Erreur d'interprétation fréquente : « -p 8080:80 se lit dans les deux sens, et -it convient aussi pour un serveur ». Non. L'ordre est hôte:conteneur (inverser = exposer le mauvais port ou échouer), et un serveur lancé en -it bloque le terminal : dès qu'on ferme, le service suit. Services en -d, outils en -it — jamais l'inverse.
Lancer un service joignable Nommer, publier le port, injecter la config --name + -d Identitéstable, en fond-p hôte:conteneur Gauche =hôte, droite = conteneur-e configuration Sansreconstruire l'image
Nommer, publier le port, injecter la config
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Nommer : Idir lance sa base avec --name bdd en détaché (-d), pour pouvoir la viser ensuite. 2) Publier : il lance le web avec -p 8080:80 — gauche hôte, droite conteneur — et ouvre http://localhost:8080. 3) Configurer : le mot de passe de la base passe en -e, sans reconstruire l'image. Leçon : nom + ports + variables en une ligne ; la base reste non publiée car rien de l'extérieur ne doit la joindre.

🔎 Exemple concret — 🔎 Exemple concret — Postgres et Nginx joignables

La stack de démo d'Idir : une base discrète, un web accessible.

docker run -d --name bdd -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web -p 8080:80 nginx:1.27

Lecture : la base tourne en fond sans port publié (inutile), le web répond sur http://localhost:8080.

Leçon : on ne publie que ce qui doit être joint de l'extérieur.

Vocabulaire de la section

-p hôte:conteneur
Publication d'un port du conteneur vers la machine hôte ; gauche = hôte, droite = conteneur.

Exemple simple : -p 8080:80 rend le web d'Idir joignable sur http://localhost:8080.

Ce que ce n'est pas : une ouverture de port à l'intérieur seul du conteneur.

Réflexe : relire gauche/droite avant chaque run.

-d (détaché)
Mode arrière-plan : le conteneur tourne sans bloquer le terminal ; le régime des services.

Exemple simple : La base bdd et le web d'Idir tournent en -d pendant la démo.

Ce que ce n'est pas : un terminal attaché qu'on doit laisser ouvert.

Réflexe : service durable = -d.

-it (interactif)
Terminal attaché au conteneur (souvent avec --rm pour les usages jetables) ; le régime des outils ponctuels.

Exemple simple : docker run -it --rm ubuntu:24.04 bash pour bricoler.

Ce que ce n'est pas : le mode d'un serveur de production.

Réflexe : besoin du clavier = -it, jamais pour un serveur.

-e et --name
-e injecte une variable de configuration au démarrage ; --name donne une identité stable pour piloter le conteneur.

Exemple simple : -e POSTGRES_PASSWORD=secret et --name bdd chez Idir.

Ce que ce n'est pas : une configuration gravée en dur dans l'image.

Réflexe : config en -e, nom systématique sur les services durables.

En pratique — En pratique — Lancer deux services

  1. Lancez une base postgres nommée avec mot de passe en -e.
  2. Lancez nginx avec publication 8080:80 et ouvrez localhost:8080.
  3. Ouvrez un shell dans chaque conteneur (exec) et comparez.
  4. Arrêtez et supprimez proprement les deux conteneurs.
Vous lancez tout service du Hub avec ports, nom et configuration.

Script prêt à dire — lancer un service (30 s)

« Je lance en détaché avec un nom : --name web -d. Je publie le port hôte vers le conteneur : -p 8080:80, gauche hôte, droite conteneur. Je passe la config en variables -e, sans toucher à l'image. Je vérifie sur localhost:8080. »

À dire en tapant la commande ligne par ligne ; montrer le terminal bloqué par un -it par contraste.

Modèle copier-coller — la ligne de lancement

docker run -d --name MONSERVICE \
  -p HOTE:CONTENEUR \
  -e CLE=valeur \
  image:tag-fige
# Ex. web d'Idir :
# docker run -d --name web -p 8080:80 nginx:1.27

Démo d'Idir à Alger

Comme ci-dessus : bdd non publiée + web en 8080:80 — le responsable voit l'appli, la base reste invisible de l'extérieur.

Outil jetable

docker run -it --rm ubuntu:24.04 bash : terminal attaché, suppression auto à la sortie — le régime des outils, jamais des serveurs.

Deux frontaux cohabitent

Deux Nginx avec le même port 80 interne, publiés en 8080:80 et 8081:80 : le port hôte diffère, le port conteneur est identique.

Changer un mot de passe

Les -e sont figés à la création : on supprime le conteneur et on relance avec la nouvelle valeur — pas de redémarrage magique.

Prudence : Deux points de vigilance : chaque port publié élargit la surface exposée de la machine — ne publiez que le nécessaire, surtout sur un poste ou un serveur partagé. Et un mot de passe passé en -e reste visible dans l'historique du shell : évitez les secrets réels dans les démos partagées et préférez des valeurs de test.

✓ Bonnes pratiques

  • Nommer systématiquement les services durables.
  • Ne publier que les ports nécessaires.
  • Passer la config par -e, jamais en dur dans l'image.

✗ Pièges fréquents

  • Inverser hôte:conteneur dans -p.
  • Lancer un serveur en -it (terminal bloqué).
  • Mettre un mot de passe en clair dans l'historique sans y penser.

Points clés à retenir

  • -p relie hôte et conteneur (gauche/droite).
  • -d pour les services, -it pour les outils.
  • -e configure sans reconstruire.
  • --name rend tout pilotable.

Défi 48h — appliquez demain

Lancez deux services nommés (base en -e non publiée + web en 8080:80), ouvrez localhost:8080, puis arrêtez et supprimez proprement. Notez l'ordre hôte:conteneur sans l'inverser.

Checklist sortie de section
  • Je publie les ports dans le bon ordre (hôte:conteneur).
  • Je choisis -d pour un service, -it pour un outil.
  • Je configure en -e et je nomme chaque service durable.
Auto-évaluation 1-5 : est-ce que je relis gauche/droite avant chaque -p ?est-ce que chaque conteneur durable a un --name ?

Questions fréquentes

Pourquoi localhost:80 ne répond pas alors que le conteneur tourne ?

Parce que le port n'est pas publié : le service écoute dans le réseau isolé du conteneur. Ajoutez -p hôte:conteneur au run — gauche = hôte, droite = conteneur.

Faut-il redémarrer pour changer une variable -e ?

Oui : les variables sont figées à la création. On supprime et on relance (ou on passe à Compose au niveau 3 pour versionner le tout).

Vérifiez votre compréhension

Vous lancez « docker run -d -p 8080:80 nginx ». Que signifie 8080:80 ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 1Questions inédites et durcies pour valider vos acquis