1.2Lanzar contenedores: puertos, nombres, modos, variables
Lo esencial en 30 segundos
- Publicar un puerto = la puerta de entrada : -p 8080:80 une el puerto 8080 de la máquina al puerto 80 del contenedor — izquierda = anfitrión, derecha = contenedor; sin publicación, el servicio queda invisible.
- Separado o interactivo, dos regímenes : los servicios corren en -d (fondo), las herramientas puntuales en -it (terminal acoplado) — un servidor en -it bloquea el terminal.
- Configurar sin reconstruir : -e CLAVE=valor pilota las imágenes oficiales y --name da una identidad estable para apuntar al contenedor (logs, exec, stop).
Minicaso conductor — Idir lanza la pila de pruebas
Idir debe mostrar la aplicación a su responsable: una base Postgres y un frontal Nginx en su máquina. Lanza la base en separado, llamada bdd, con la contraseña pasada en -e — sin publicar su puerto, inútil para una demo local. Luego lanza la web llamada web con -p 8080:80 y abre http://localhost:8080: la página se muestra. Cuando su responsable pregunta « ¿cuál es el contenedor, la base? », Idir responde « bdd » — un nombre, no un identificador hexadecimal.
Continuación del caso 1.1 — Idir pasa de las imágenes elegidas a los contenedores lanzados.
1. Publicar un puerto: la puerta de entrada
Un contenedor vive en su red aislada: sin publicación, su puerto 80 es invisible desde la máquina. -p 8080:80 une el puerto 8080 de la máquina al puerto 80 del contenedor. La regla: izquierda = anfitrión, derecha = contenedor. Dos contenedores pueden exponer el mismo puerto interno con puertos de anfitrión distintos.
Solo se publica lo que deba alcanzarse desde fuera: el frontal web sí, la base de datos no (seguirá accesible en interno, sección 1.4).
2. Separado o interactivo: dos regímenes
Los servicios corren en separado (-d, en fondo). Las herramientas puntuales corren en interactivo (-it, terminal acoplado: docker run -it --rm ubuntu:24.04 bash). No se mezclan: un servidor en -it bloquea el terminal, un shell en -d es inutilizable.
El reflejo: « ¿es un servicio que debe correr solo? -d. ¿Es una herramienta de la que necesito el teclado? -it. »
3. Configurar sin reconstruir: -e y --name
Las imágenes oficiales se pilotan con variables de entorno (-e POSTGRES_PASSWORD=secret): no hace falta reconstruir una imagen para cambiar una contraseña. --name da una identidad estable para apuntar al contenedor (logs, exec, stop).
Nombre + variables + puertos: el 90 % de los lanzamientos cabe en una línea. Las variables quedan fijadas en la creación: para cambiarlas, se elimina y se relanza.
🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Postgres y Nginx accesibles
La pila de demostración de Idir: una base discreta, una web accesible.
docker run -d --name bdd -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web -p 8080:80 nginx:1.27
Lectura: la base corre en fondo sin puerto publicado (inútil), la web responde en http://localhost:8080.
Lección: solo se publica lo que deba alcanzarse desde fuera.
Vocabulario de la sección
- -p anfitrión:contenedor
- Publicación de un puerto del contenedor hacia la máquina anfitriona; izquierda = anfitrión, derecha = contenedor.
Ejemplo sencillo: -p 8080:80 hace la web de Idir accesible en http://localhost:8080.
Lo que no es: una apertura de puerto solo dentro del contenedor.
Reflejo: releer izquierda/derecha antes de cada run.
- -d (separado)
- Modo segundo plano: el contenedor corre sin bloquear el terminal; el régimen de los servicios.
Ejemplo sencillo: La base bdd y la web de Idir corren en -d durante la demo.
Lo que no es: un terminal acoplado que hay que dejar abierto.
Reflejo: servicio durable = -d.
- -it (interactivo)
- Terminal acoplado al contenedor (a menudo con --rm para usos desechables); el régimen de las herramientas puntuales.
Ejemplo sencillo: docker run -it --rm ubuntu:24.04 bash para trastear.
Lo que no es: el modo de un servidor de producción.
Reflejo: necesidad del teclado = -it, nunca para un servidor.
- -e y --name
- -e inyecta una variable de configuración al arrancar; --name da una identidad estable para pilotar el contenedor.
Ejemplo sencillo: -e POSTGRES_PASSWORD=secret y --name bdd en casa de Idir.
Lo que no es: una configuración grabada en duro en la imagen.
Reflejo: config en -e, nombre sistemático en los servicios durables.
En la práctica — En práctica — Lanzar dos servicios
- Lance una base postgres nombrada con contraseña en -e.
- Lance nginx con publicación 8080:80 y abra localhost:8080.
- Abra un shell en cada contenedor (exec) y compare.
- Detenga y elimine limpiamente los dos contenedores.
Script listo para decir — lanzar un servicio (30 s)
« Lanzo en separado con un nombre: --name web -d. Publico el puerto del anfitrión hacia el contenedor: -p 8080:80, izquierda anfitrión, derecha contenedor. Paso la config en variables -e, sin tocar la imagen. Verifico en localhost:8080. »
Para decir escribiendo el comando línea por línea; mostrar el terminal bloqueado por un -it por contraste.
Modelo copiar-pegar — la línea de lanzamiento
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
Demo de Idir en Argel
Como arriba: bdd sin publicar + web en 8080:80 — el responsable ve la app, la base queda invisible desde fuera.
Herramienta desechable
docker run -it --rm ubuntu:24.04 bash: terminal acoplado, eliminación auto al salir — el régimen de las herramientas, nunca de los servidores.
Dos frontales conviven
Dos Nginx con el mismo puerto 80 interno, publicados en 8080:80 y 8081:80: el puerto de anfitrión difiere, el puerto de contenedor es idéntico.
Cambiar una contraseña
Las -e quedan fijadas en la creación: se elimina el contenedor y se relanza con el nuevo valor — sin reinicio mágico.
✓ Buenas prácticas
- Nombrar sistemáticamente los servicios durables.
- Publicar solo los puertos necesarios.
- Pasar la config por -e, nunca en duro en la imagen.
✗ Errores frecuentes
- Invertir anfitrión:contenedor en -p.
- Lanzar un servidor en -it (terminal bloqueado).
- Poner una contraseña en claro en el historial sin pensar.
Puntos clave
- -p une anfitrión y contenedor (izquierda/derecha).
- -d para los servicios, -it para las herramientas.
- -e configura sin reconstruir.
- --name hace todo pilotable.
Desafío 48h — aplique mañana
Lance dos servicios nombrados (base en -e sin publicar + web en 8080:80), abra localhost:8080, luego detenga y elimine limpiamente. Anote el orden anfitrión:contenedor sin invertirlo.
- Publico los puertos en el buen orden (anfitrión:contenedor).
- Elijo -d para un servicio, -it para una herramienta.
- Configuro en -e y nombro cada servicio durable.
Preguntas frecuentes
¿Por qué localhost:80 no responde aunque el contenedor corre?
Porque el puerto no está publicado: el servicio escucha en la red aislada del contenedor. Añada -p anfitrión:contenedor al run — izquierda = anfitrión, derecha = contenedor.
¿Hay que reiniciar para cambiar una variable -e?
Sí: las variables quedan fijadas en la creación. Se elimina y se relanza (o se pasa a Compose en el nivel 3 para versionarlo todo).
Lanza « docker run -d -p 8080:80 nginx ». ¿Qué significa 8080:80?