docker-crear-iniciar-contenedores

Crear e iniciar contenedores

  • 7 min

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) + docker create + docker start

Cuando lanzamos un contenedor, ocurren tres fases distintas:

  1. Obtención: Se descarga la imagen (si no la tienes).
  2. Creación: Se prepara el contenedor en el disco (se asigna ID, red, volúmenes), pero no consume CPU ni RAM. Está “dormido”.
  3. 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...]
Copied!
  • 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
Copied!

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
Copied!

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
Copied!

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
Copied!

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...]
Copied!
  • 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
Copied!

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