Ya hemos visto en acción el comando docker run, una instrucción combinada que orquesta secuencialmente todo el proceso de instanciación en Docker.
Es el comando más famoso de la herramienta, el que protagoniza casi cualquier tutorial y el que ejecutarás el 90% de las veces para levantar un servicio.
Pero no es el único comando implicado. En este artículo a vamos a ver el ciclo de vida de nuestras aplicaciones, y la diferencia entre crear (create), encender (start) y ejecutar (run) 👇.
docker run es un “atajo”
Internamente, cuando ejecutas ese comando, Docker está realizando varias operaciones secuenciales por ti.
docker run = docker
pull(si hace falta) + dockercreate+ dockerstart
Cuando lanzamos un contenedor, ocurren tres fases distintas:
- Obtención: Se descarga la imagen (si no la tienes).
- Creación: Se prepara el contenedor en el disco (se asigna ID, red, volúmenes), pero no consume CPU ni RAM. Está “dormido”.
- Arranque: El proceso principal se ejecuta y el contenedor cobra vida.
Docker Create
El comando docker create crea la capa de escritura del contenedor encima de la imagen y prepara la configuración, pero no lo arranca.
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
- OPTIONS: Parámetros para configurar el contenedor.
- IMAGE: La imagen de Docker desde la cual se creará el contenedor.
- COMMAND: Comando opcional que se ejecutará dentro del contenedor.
- ARG…: Argumentos adicionales para el comando.
Por ejemplo,
docker create --name mi-servidor-web -p 8080:80 nginx
Si ejecutas esto, verás que Docker te devuelve un ID largo y… nada más. No pasa nada. Si vas a tu navegador a localhost:8080, no cargará nada.
Si miramos el estado con docker ps -a (el flag -a es para ver también los parados), veremos:
CONTAINER ID IMAGE STATUS NAMES
a1b2c3d4e5 nginx Created mi-servidor-web
Fíjate en el estado: Created. El contenedor existe, tiene nombre, tiene puertos asignados, pero está “apagado”.
¿Para qué sirve esto? Es muy útil en orquestación o scripts avanzados donde quieres “pre-aprovisionar” contenedores para que estén listos, y arrancarlos todos a la vez más tarde en milisegundos.
Docker Start
Ahora que tenemos el contenedor creado (pero apagado), vamos a arrancarlo.
docker start mi-servidor-web
Ahora sí. Docker busca el contenedor que ya existía y simplemente pone en marcha el proceso. Si volvemos a mirar el estado:
CONTAINER ID IMAGE STATUS NAMES
a1b2c3d4e5 nginx Up 4 seconds mi-servidor-web
Estado: Up. Ahora sí consume RAM y CPU.
También existe, lógicamente, docker stop. Este comando envía una señal de parada (SIGTERM) al contenedor. Lo apaga, pero NO lo destruye.
El contenedor vuelve al estado “Exited”, manteniendo sus datos y configuración listos para un nuevo docker start.
Docker Run
Como hemos dicho, docker run es simplemente la comodidad de hacer todo lo anterior en una sola línea.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
- OPTIONS: Parámetros para configurar el contenedor.
- IMAGE: La imagen de Docker desde la cual se creará el contenedor.
- COMMAND: Comando opcional que se ejecutará dentro del contenedor.
- ARG…: Argumentos adicionales para el comando.
Por ejemplo,
docker run --name mi-otro-web -p 8081:80 -d nginx
Docker comprueba si tiene la imagen, crea el contenedor y lo arranca inmediatamente.
¿Cuándo usar cada uno?
No hagas docker run cada vez o crearás contenedores duplicados.
docker run: El 95% de las veces. Cuando quieres levantar un servicio nuevo desde cero.docker start: Cuando tienes un contenedor que ya creaste previamente (quizás una base de datos con datos persistentes) y simplemente quieres “reanudar” el trabajo donde lo dejaste.
Ejemplos prácticos
Ejecutar un servidor web en un contenedor
Este ejemplo muestra cómo ejecutar un servidor web Nginx en un contenedor:
docker run -d -p 8080:80 --name mi_nginx nginx
-d: Ejecuta el contenedor en segundo plano (modo “detached”).-p 8080:80: Mapea el puerto 8080 del host al puerto 80 del contenedor.--name mi_nginx: Asigna un nombre personalizado al contenedor.nginx: Es la imagen de Docker que se utiliza.
Copiar archivos entre el host y el contenedor
Para copiar un archivo desde el host al contenedor:
docker cp archivo.txt <ID_del_contenedor>:/ruta/destino/
Para copiar un archivo desde el contenedor al host:
docker cp <ID_del_contenedor>:/ruta/origen/archivo.txt /ruta/destino/
Ejecutar un contenedor con variables de entorno
Este ejemplo muestra cómo ejecutar un contenedor con variables de entorno personalizadas:
docker run -e "MI_VARIABLE=valor" ubuntu env
-e "MI_VARIABLE=valor": Define una variable de entorno dentro del contenedor.env: Muestra todas las variables de entorno en el contenedor.
