1.2 · Lanzar contenedores: puertos, nombres, modos, variables

Nivel 1 · Contenedores: imágenes, volúmenes, redes

1.2Lanzar contenedores: puertos, nombres, modos, variables

Objetivo: arrancar cualquier servicio del Hub exponiendo puertos y configuración.
Tiempo estimado: 13 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

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.

Error frecuente de interpretación: « -p 8080:80 se lee en ambos sentidos, y -it también sirve para un servidor ». No. El orden es anfitrión:contenedor (invertirlo = exponer el puerto equivocado o fallar), y un servidor lanzado en -it bloquea el terminal: en cuanto se cierra, el servicio cae. Servicios en -d, herramientas en -it — nunca al revés.
Lanzar un servicio accesible Nombrar, publicar el puerto, inyectar la config --name + -d Identidadestable, en fondo-p anfitrión:contenedor Izquierda =anfitrión, derecha = contenedor-e configuración Sinreconstruir la imagen
Nombrar, publicar el puerto, inyectar la config
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Nombrar: Idir lanza su base con --name bdd en separado (-d), para poder apuntarla después. 2) Publicar: lanza la web con -p 8080:80 — izquierda anfitrión, derecha contenedor — y abre http://localhost:8080. 3) Configurar: la contraseña de la base pasa en -e, sin reconstruir la imagen. Lección: nombre + puertos + variables en una línea; la base queda sin publicar porque nada de fuera debe alcanzarla.

🔎 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

  1. Lance una base postgres nombrada con contraseña en -e.
  2. Lance nginx con publicación 8080:80 y abra localhost:8080.
  3. Abra un shell en cada contenedor (exec) y compare.
  4. Detenga y elimine limpiamente los dos contenedores.
Lanza todo servicio del Hub con puertos, nombre y configuración.

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.

Prudencia: Dos puntos de vigilancia: cada puerto publicado amplía la superficie expuesta de la máquina — publique solo lo necesario, sobre todo en un puesto o servidor compartido. Y una contraseña pasada en -e queda visible en el historial del shell: evite secretos reales en las demos compartidas y prefiera valores de prueba.

✓ 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.

Lista de salida de la sección
  • 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.
Autoevaluación 1-5: ¿releo izquierda/derecha antes de cada -p?¿cada contenedor durable tiene un --name?

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).

Comprueba tu comprensión

Lanza « docker run -d -p 8080:80 nginx ». ¿Qué significa 8080:80?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 1Preguntas inéditas y más difíciles para validar tus conocimientos