Saltar al contenido principal

🐳 Creando nuestro primer contenedor

En esta clase damos el primer paso práctico con Docker: crear un contenedor desde cero.

El objetivo no es entender todavía todos los conceptos en profundidad, sino ver el flujo completo para conseguir ejecutar una aplicación dentro de un contenedor. Más adelante se profundizará en cada una de las instrucciones utilizadas.

🚀 El primer objetivo

Partimos de un proyecto muy sencillo y simulamos una situación habitual:

“Necesito que esta aplicación funcione cuanto antes.”

Para conseguirlo vamos a crear un Dockerfile, construir una imagen y ejecutar un contenedor.

Este recorrido permite entender cómo Docker empaqueta una aplicación junto con todo el entorno que necesita para funcionar.

📄 ¿Qué es un Dockerfile?

El primer paso consiste en crear un archivo llamado Dockerfile.

Este archivo actúa como una receta que indica a Docker:

  • Desde qué imagen partir
  • Qué archivos copiar
  • Qué carpeta utilizar como directorio de trabajo
  • Qué comando ejecutar cuando el contenedor se inicie

En pocas líneas describe todo el proceso necesario para construir un contenedor.

🧱 Elegir una imagen base

Toda imagen Docker comienza a partir de otra imagen existente.

En este ejemplo se utiliza:

  • Node.js 22
  • Alpine Linux como sistema operativo

La imagen Alpine es especialmente popular porque:

  • Es extremadamente ligera
  • Ocupa muy poco espacio
  • Está orientada a seguridad y rendimiento

En lugar de instalar todo manualmente, Docker reutiliza una imagen ya preparada como punto de partida.

🛠️ Trabajar mejor con Dockerfiles

Durante la clase también se recomienda instalar la extensión oficial de Docker para Visual Studio Code.

Esta extensión proporciona:

  • Autocompletado
  • Resaltado de sintaxis
  • Ayudas para escribir instrucciones Docker

Aunque no es obligatoria, facilita mucho la escritura de Dockerfiles.

📁 Configurar el directorio de trabajo

Una vez elegida la imagen base, el siguiente paso es indicar dónde trabajará la aplicación dentro del contenedor.

Después se copia el archivo principal del proyecto (app.js) al directorio configurado.

De esta forma, cuando el contenedor se ejecute, el código ya estará disponible dentro de su sistema de archivos.

▶️ Definir el comando de inicio

El último paso del Dockerfile consiste en indicar qué debe ejecutarse cuando el contenedor arranque.

En este caso se utiliza el comando para ejecutar la aplicación con Node.js.

También se explica por qué es recomendable utilizar la sintaxis basada en lista de argumentos para que Docker gestione correctamente el proceso principal y los posibles errores.

🏗️ Construyendo la imagen

Con el Dockerfile terminado ya puede construirse la imagen mediante:

docker build -t mi-primera-imagen .

Este comando:

  • Lee el Dockerfile
  • Ejecuta cada una de sus instrucciones
  • Genera una imagen reutilizable

Es importante entender que todavía no existe un contenedor, únicamente se está creando la plantilla que permitirá generarlos posteriormente.

🧩 Imagen vs Contenedor

Uno de los conceptos más importantes de la clase es diferenciar ambos términos.

Imagen

La imagen es la plantilla o receta.

Puede reutilizarse tantas veces como sea necesario.

Contenedor

El contenedor es una instancia creada a partir de esa imagen.

Una misma imagen puede utilizarse para crear decenas o incluso cientos de contenedores diferentes.

▶️ Ejecutar el primer contenedor

Una vez construida la imagen ya puede ejecutarse:

docker run mi-primera-imagen

En ese momento Docker:

  • Crea un contenedor nuevo
  • Ejecuta la aplicación
  • Utiliza el entorno definido en la imagen

La aplicación se ejecuta dentro de Docker Engine, independientemente del sistema operativo del equipo anfitrión.

En el ejemplo, aunque el ordenador utiliza macOS, la aplicación se ejecuta sobre Linux dentro del contenedor.

📋 Ver los contenedores creados

Con el comando:

docker ps -a

es posible consultar todos los contenedores creados.

Docker muestra información como:

  • ID del contenedor
  • Imagen utilizada
  • Estado
  • Fecha de creación
  • Comando ejecutado

Esto permite inspeccionar fácilmente el historial de ejecuciones.

♻️ Una imagen puede generar muchos contenedores

Cada vez que se ejecuta docker run se crea un contenedor completamente nuevo.

No importa que todos provengan de la misma imagen.

Cada ejecución es independiente y genera una nueva instancia.

🧹 El parámetro --rm

Muchas veces interesa que el contenedor desaparezca automáticamente al finalizar.

Para ello puede utilizarse:

docker run --rm mi-primera-imagen

Cuando el proceso termina:

  • Docker elimina automáticamente el contenedor
  • No quedan contenedores innecesarios almacenados
  • El sistema permanece más limpio

Es una práctica muy habitual para procesos temporales o scripts que sólo necesitan ejecutarse una vez.

💡 Docker sirve para mucho más que servidores

Aunque Docker suele asociarse a servidores web, también puede utilizarse para ejecutar:

  • Scripts
  • Procesos puntuales
  • Herramientas de línea de comandos
  • Bases de datos
  • Entornos completos de desarrollo
  • Sandboxes para ejecutar código aislado

Un contenedor puede vivir únicamente unos segundos si eso es todo lo que necesita la aplicación.

📌 Ideas clave de esta clase

Quédate con estos conceptos:

  • Un Dockerfile describe cómo construir una imagen.
  • Toda imagen parte de otra imagen base.
  • Una imagen es una plantilla reutilizable.
  • Un contenedor es una instancia creada desde una imagen.
  • docker build construye imágenes.
  • docker run crea y ejecuta contenedores.
  • Una misma imagen puede generar múltiples contenedores.
  • docker ps -a permite consultar todos los contenedores.
  • --rm elimina automáticamente los contenedores temporales.
  • Docker no sólo sirve para ejecutar servidores.

🚀 Lo siguiente: entender Docker en profundidad

En esta clase se ha recorrido el flujo completo para crear el primer contenedor sin detenerse demasiado en cada detalle.

A partir de ahora se profundizará en los conceptos que hay detrás de cada instrucción del Dockerfile, el funcionamiento de las imágenes y la arquitectura de Docker para comprender realmente qué ocurre durante todo el proceso.


💡 Tip: No memorices todavía todos los comandos. Lo importante es entender el flujo general: Dockerfile → Imagen → Contenedor. Ese modelo mental será la base para todo lo que aprenderás a continuación.