Una vez que tienes Docker instalado y entiendes qué es una imagen, llega el momento clave: poner en marcha tu primer contenedor. En esta lección aprenderás a fondo el comando docker run, que es la puerta de entrada para crear y ejecutar contenedores a partir de imágenes. Veremos los flags (opciones) más habituales que utilizarás a diario, cómo ejecutar comandos dentro de los contenedores y repasaremos ejemplos prácticos paso a paso. Dominar docker run es imprescindible, porque casi todo lo que harás con Docker empieza por ejecutar un contenedor.

¿Qué hace docker run?

El comando docker run realiza varias acciones en un solo paso:

  • Busca la imagen indicada en tu máquina local.
  • Si no la encuentra, la descarga automáticamente desde un registro (por defecto, Docker Hub).
  • Crea un contenedor nuevo a partir de esa imagen.
  • Lo arranca y ejecuta el comando configurado dentro de él.

La forma básica del comando es la siguiente:

docker run [opciones] imagen [comando] [argumentos]
  • docker run: la orden para crear y ejecutar un contenedor.
  • [opciones]: flags que modifican el comportamiento (por ejemplo, -d, -p, --name).
  • imagen: el nombre de la imagen base (por ejemplo, nginx o ubuntu).
  • [comando]: orden opcional a ejecutar dentro del contenedor, que sobrescribe el comando por defecto de la imagen.

Un primer ejemplo muy sencillo:

docker run hello-world
  • Docker descarga la imagen hello-world (si no la tiene), crea un contenedor, ejecuta su programa de bienvenida y termina. Es la forma clásica de comprobar que tu instalación funciona.

Los Flags Más Habituales

A continuación recopilamos las opciones que usarás constantemente. Esta tabla es una referencia rápida; después veremos cada una en detalle.

Flag Significado Ejemplo de uso
-it Modo interactivo con terminal (combinación de -i y -t) docker run -it ubuntu bash
-d Modo detached: ejecuta en segundo plano docker run -d nginx
--name Asigna un nombre legible al contenedor docker run --name web nginx
-p Publica un puerto del contenedor en el host docker run -p 8080:80 nginx
-e Define una variable de entorno docker run -e CLAVE=valor imagen
--rm Elimina el contenedor automáticamente al detenerse docker run --rm alpine echo hola

El flag -it: modo interactivo

-it es en realidad la combinación de dos flags:

  • -i (interactive): mantiene la entrada estándar abierta, de modo que puedes escribir comandos.
  • -t (tty): asigna una pseudo-terminal, que da formato a la salida como si fuera una consola real.
docker run -it ubuntu bash
  • ubuntu: imagen base de Ubuntu.
  • bash: comando a ejecutar dentro del contenedor; sobrescribe el comando por defecto.
  • El resultado es que te encuentras dentro de una shell del contenedor, donde puedes escribir comandos de Linux. Para salir, escribe exit.

Esta combinación es ideal para explorar un contenedor, probar comandos o depurar.

El flag -d: ejecución en segundo plano

Cuando ejecutas un servicio de larga duración (como un servidor web), no quieres que ocupe tu terminal. El flag -d (detached) lo lanza en segundo plano.

docker run -d nginx
  • Docker arranca Nginx en segundo plano y te devuelve un identificador largo (el ID del contenedor).
  • Tu terminal queda libre para seguir trabajando.

Para ver los contenedores que están corriendo, usarás más adelante docker ps.

El flag --name: poner nombre al contenedor

Si no indicas un nombre, Docker genera uno aleatorio y curioso (como nervous_einstein). Asignar un nombre propio facilita referirte al contenedor después.

docker run -d --name servidor_web nginx
  • --name servidor_web: el contenedor se llamará servidor_web.
  • Ahora puedes usar ese nombre en otros comandos, como docker stop servidor_web.

Importante: los nombres deben ser únicos. Si ya existe un contenedor con ese nombre (aunque esté detenido), Docker dará error.

El flag -p: publicar puertos

Por defecto, los puertos de un contenedor no son accesibles desde el host. El flag -p (publish) crea un puente entre un puerto del host y uno del contenedor.

docker run -d -p 8080:80 --name web nginx
  • -p 8080:80: mapea el puerto 8080 del host al puerto 80 del contenedor.
  • La sintaxis es siempre host:contenedor.
  • Ahora puedes abrir http://localhost:8080 en tu navegador y verás la página de Nginx, que internamente escucha en el puerto 80.

El flag -e: variables de entorno

Muchas imágenes se configuran mediante variables de entorno. El flag -e (environment) te permite definirlas.

docker run -d --name basedatos \
  -e POSTGRES_PASSWORD=ejemplo \
  -e POSTGRES_DB=tienda \
  postgres:16
  • -e POSTGRES_PASSWORD=ejemplo: define la contraseña del usuario administrador de PostgreSQL.
  • -e POSTGRES_DB=tienda: indica que se cree una base de datos llamada tienda al iniciar.
  • Puedes repetir -e tantas veces como variables necesites.

El flag --rm: limpieza automática

Cuando un contenedor termina, no se borra: queda en estado exited ocupando espacio. El flag --rm hace que Docker lo elimine automáticamente al detenerse.

docker run --rm alpine echo "Hola desde un contenedor temporal"
  • alpine: imagen Linux muy ligera.
  • echo "...": imprime un mensaje y termina.
  • Como el contenedor termina enseguida y usamos --rm, no queda rastro de él. Es perfecto para tareas puntuales y de un solo uso.

Ejecutar Comandos en el Contenedor

El comando que indicas al final de docker run sustituye al comando por defecto de la imagen. Esto te da mucho control.

# Comando por defecto de la imagen ubuntu (que termina enseguida)
docker run ubuntu

# Sobrescribir el comando para que muestre la versión del sistema
docker run ubuntu cat /etc/os-release
  • En el segundo caso, el contenedor arranca, ejecuta cat /etc/os-release (que muestra información del sistema operativo) y termina.

También puedes pasar varios argumentos:

docker run alpine ls -l /etc
  • ls -l /etc: lista en formato detallado el contenido del directorio /etc del contenedor.

Combinando Flags: Ejemplos Prácticos

En la vida real combinarás varios flags en un mismo comando. Veamos casos completos.

Ejemplo 1: un servidor web listo para usar

docker run -d --name mi_web -p 8080:80 nginx
  • -d: en segundo plano.
  • --name mi_web: nombre legible.
  • -p 8080:80: accesible en http://localhost:8080.
  • Un solo comando y ya tienes un servidor web funcionando.

Ejemplo 2: una shell temporal para investigar

docker run -it --rm alpine sh
  • -it: terminal interactiva.
  • --rm: se borra al salir.
  • sh: abre una shell ligera de Alpine.
  • Cuando escribas exit, el contenedor desaparece sin dejar rastro. Ideal para pruebas rápidas.

Ejemplo 3: una base de datos configurada

docker run -d --name pg_demo \
  -e POSTGRES_PASSWORD=secreto123 \
  -p 5432:5432 \
  postgres:16
  • Lanza PostgreSQL en segundo plano, con contraseña definida y el puerto 5432 accesible desde el host para conectar con un cliente de base de datos.

Errores Comunes y Consejos

  • Olvidar -d en servicios largos: si lanzas Nginx sin -d, tu terminal quedará bloqueada mostrando los logs. Pulsa Ctrl+C para detenerlo y vuelve a lanzarlo con -d.
  • Invertir el orden de -p: recuerda que es host:contenedor. Poner -p 80:8080 cuando Nginx escucha en el 80 no funcionará.
  • Nombres duplicados: si reutilizas un --name existente, Docker dará error. Elimina el contenedor anterior o usa otro nombre.
  • Esperar -it en un proceso de segundo plano: combinar -d con -it no tiene sentido en la mayoría de casos; usa -d para servicios y -it para sesiones interactivas.
  • Acumular contenedores parados: si haces muchas pruebas, usa --rm para no llenar tu sistema de contenedores detenidos.
  • Consejo: empieza siempre con --name descriptivos; te ahorrará tiempo cuando tengas varios contenedores en marcha.

Ejercicios

Ejercicio 1: tu primer servidor web

Lanza un contenedor de Nginx en segundo plano, con el nombre practica_web, accesible desde el puerto 9090 del host. Comprueba en el navegador que funciona.

Ejercicio 2: explorar un contenedor

Abre una shell interactiva en un contenedor de Ubuntu y, una vez dentro, muestra el contenido del directorio raíz (/). Luego sal del contenedor.

Ejercicio 3: contenedor de un solo uso

Ejecuta un contenedor de Alpine que imprima la fecha actual del sistema y que se elimine automáticamente al terminar.

Soluciones

Solución 1

docker run -d --name practica_web -p 9090:80 nginx

Abre http://localhost:9090 en tu navegador: deberías ver la página de bienvenida de Nginx.

Solución 2

docker run -it ubuntu bash
# Ya dentro del contenedor:
ls /
exit

El comando ls / lista los directorios del sistema de archivos del contenedor; exit cierra la sesión.

Solución 3

docker run --rm alpine date

El contenedor arranca, ejecuta date (que muestra la fecha y hora), termina y se elimina solo gracias a --rm.

Conclusión

En esta lección hemos diseccionado el comando docker run, la herramienta fundamental para crear y ejecutar contenedores. Hemos aprendido qué hace internamente, hemos repasado en detalle los flags más habituales (-it, -d, --name, -p, -e, --rm), cómo ejecutar comandos personalizados dentro de los contenedores y cómo combinar todo en ejemplos prácticos reales.

En la siguiente lección, Ciclo de Vida del Contenedor, descubrirás qué ocurre con un contenedor después de lanzarlo: los distintos estados por los que pasa (creado, en ejecución, pausado, detenido) y los comandos para controlar esas transiciones.

© Copyright 2026. Todos los derechos reservados