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: 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,nginxoubuntu).[comando]: orden opcional a ejecutar dentro del contenedor, que sobrescribe el comando por defecto de la imagen.
Un primer ejemplo muy sencillo:
- 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.
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 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.
--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.
-p 8080:80: mapea el puerto8080del host al puerto80del contenedor.- La sintaxis es siempre
host:contenedor. - Ahora puedes abrir
http://localhost:8080en tu navegador y verás la página de Nginx, que internamente escucha en el puerto80.
El flag -e: variables de entorno
Muchas imágenes se configuran mediante variables de entorno. El flag -e (environment) te permite definirlas.
-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 llamadatiendaal iniciar.- Puedes repetir
-etantas 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.
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:
ls -l /etc: lista en formato detallado el contenido del directorio/etcdel 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
-d: en segundo plano.--name mi_web: nombre legible.-p 8080:80: accesible enhttp://localhost:8080.- Un solo comando y ya tienes un servidor web funcionando.
Ejemplo 2: una shell temporal para investigar
-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
- Lanza PostgreSQL en segundo plano, con contraseña definida y el puerto
5432accesible desde el host para conectar con un cliente de base de datos.
Errores Comunes y Consejos
- Olvidar
-den servicios largos: si lanzas Nginx sin-d, tu terminal quedará bloqueada mostrando los logs. PulsaCtrl+Cpara detenerlo y vuelve a lanzarlo con-d. - Invertir el orden de
-p: recuerda que eshost:contenedor. Poner-p 80:8080cuando Nginx escucha en el 80 no funcionará. - Nombres duplicados: si reutilizas un
--nameexistente, Docker dará error. Elimina el contenedor anterior o usa otro nombre. - Esperar
-iten un proceso de segundo plano: combinar-dcon-itno tiene sentido en la mayoría de casos; usa-dpara servicios y-itpara sesiones interactivas. - Acumular contenedores parados: si haces muchas pruebas, usa
--rmpara no llenar tu sistema de contenedores detenidos. - Consejo: empieza siempre con
--namedescriptivos; 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
Abre http://localhost:9090 en tu navegador: deberías ver la página de bienvenida de Nginx.
Solución 2
El comando ls / lista los directorios del sistema de archivos del contenedor; exit cierra la sesión.
Solución 3
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.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
