1.2Lancer des conteneurs : ports, noms, modes, variables
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.
🔎 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
- Lancez une base postgres nommée avec mot de passe en -e.
- Lancez nginx avec publication 8080:80 et ouvrez localhost:8080.
- Ouvrez un shell dans chaque conteneur (exec) et comparez.
- Arrêtez et supprimez proprement les deux conteneurs.
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.
✓ 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.
- 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.
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).
Vous lancez « docker run -d -p 8080:80 nginx ». Que signifie 8080:80 ?