Qué es Docker y para qué sirve

Docker es una plataforma abierta para desarrollar, distribuir y ejecutar aplicaciones dentro de contenedores. Un contenedor empaqueta el código y todo lo que necesita, así que funciona igual en cualquier máquina.

Actualizado el 6 min de lectura

Objetivos de aprendizaje

Después de leer este artículo podrás:

  • Entender qué son imagen, contenedor, Dockerfile y registry
  • Leer y escribir un Dockerfile sencillo y ejecutarlo con docker build y docker run
  • Saber cuándo Docker ayuda y cuándo no hace falta
En esta página

"En mi máquina funciona" es una de las frases más antiguas del desarrollo. En el servidor, la versión de Node era otra, faltaba una librería del sistema o la variable de entorno tenía otro nombre. Docker lo resuelve cambiando lo que entregas: en vez de solo el código, entregas el código junto con el entorno en el que se ejecuta.

Dockerfiledocker buildImagensolo lecturapush / pullRegistryDocker Hubdocker runContenedorContenedorContenedorDocker daemon (dockerd)ejecuta el build, el push y el run que pide el cliente docker
Una receta, una imagen inmutable, muchos contenedores iguales; el daemon ejecuta cada comando del cliente docker.

¿Qué es Docker?#

Docker empaqueta la aplicación y todo lo que necesita en un contenedor, un entorno aislado que no depende de lo que esté instalado en el host. Puedes ejecutar muchos contenedores a la vez en la misma máquina, y cada uno se comporta igual dondequiera que corra.

La documentación oficial define el contenedor como un proceso aislado con todos los archivos que necesita para ejecutarse. No hay un segundo sistema operativo: los contenedores comparten el kernel del host. Esa es la diferencia central con una máquina virtual, explicada en contenedores vs máquinas virtuales.

¿Cuáles son las piezas de Docker?#

Cinco conceptos cubren casi todo:

  • Imagen: una plantilla de solo lectura con las instrucciones para crear un contenedor. Está hecha de capas, y cada capa es un conjunto de cambios en el sistema de archivos. Una vez creada, una imagen no cambia: para modificarla construyes otra.
  • Contenedor: una instancia ejecutable de una imagen. Creas, inicias, detienes y eliminas contenedores. Por defecto, cada uno está aislado de los demás y del host.
  • Dockerfile: el archivo de texto con las instrucciones para construir la imagen.
  • Registry: el lugar donde se guardan las imágenes. Docker Hub es el registry público que Docker consulta por defecto, y también puedes tener uno privado.
  • Docker Engine: el programa que hace el trabajo, con un modelo cliente-servidor. El cliente (docker) envía comandos como docker run al daemon (dockerd), que crea y gestiona imágenes, contenedores, redes y volúmenes. Se comunican por una API REST.

En Linux instalas Docker Engine directamente. En Windows y macOS el camino es Docker Desktop, que reúne el daemon, el cliente y Compose en una sola aplicación.

¿Cómo ejecutar un contenedor en un minuto?#

Con Docker instalado, la primera prueba es esta:

bash
docker run --rm hello-world

Docker busca la imagen hello-world en local, no la encuentra, la descarga de Docker Hub, crea un contenedor, imprime un mensaje y termina. La opción --rm elimina el contenedor al acabar. Usa docker ps para ver los contenedores en ejecución; docker ps -a incluye también los detenidos.

¿Cómo poner una aplicación en un contenedor?#

Describes la imagen en un Dockerfile en la raíz del proyecto. El ejemplo empaqueta una aplicación Node.js que escucha en el puerto 3000:

dockerfile
FROM node:lts-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]

Instrucción por instrucción:

  • FROM define la imagen base. Todo Dockerfile empieza por ella. Si no indicas la etiqueta, Docker asume latest, así que indica siempre una. lts-slim sigue la versión LTS activa de Node.js; para builds totalmente reproducibles, fija también la versión mayor.
  • WORKDIR define la carpeta de trabajo de las instrucciones siguientes y la crea si no existe.
  • COPY y RUN crean capas. Copiar package*.json e instalar las dependencias antes de copiar el resto del código permite que Docker reutilice esa capa en las siguientes compilaciones, mientras las dependencias no cambien.
  • EXPOSE solo documenta el puerto. No publica nada.
  • CMD es el comando por defecto del contenedor. Usa la forma exec, una lista JSON con comillas dobles, que no pasa por un shell.

Crea también un archivo .dockerignore con node_modules y .env, para no copiar dependencias locales ni secretos dentro de la imagen. Después construye y ejecuta:

bash
docker build -t mi-app .
docker run --rm -p 3000:3000 mi-app

-p 3000:3000 publica el puerto 3000 del contenedor en el puerto 3000 de tu máquina. Abre http://localhost:3000 y la aplicación debería responder. Si no responde, comprueba que tu código escucha en 0.0.0.0 y no solo en 127.0.0.1: dentro del contenedor, 127.0.0.1 es el propio contenedor. Para el paso a paso completo, mira cómo dockerizar una aplicación.

¿Qué pasa con los datos de un contenedor?#

Los cambios que un contenedor hace en sus propios archivos se borran cuando se elimina. Para conservar datos, como los archivos de una base de datos, usa un volumen, que existe con independencia del ciclo de vida de cualquier contenedor:

bash
docker volume create datos
docker run -d -v datos:/var/lib/data mi-imagen

La sintaxis es -v nombre-del-volumen:ruta-en-el-contenedor. Un volumen puede compartirse entre varios contenedores y solo se elimina si lo pides, con docker volume rm.

¿Para qué sirve Docker en la práctica?#

  • El mismo entorno en todas partes: el contenedor que funcionó en tu equipo es el que corre en el servidor.
  • Incorporación rápida: quien entra al equipo levanta la aplicación y la base de datos con un comando, sin instalar nada a mano. Para varios contenedores juntos, Docker Compose describe todo en un archivo.
  • Aislamiento: dos aplicaciones que necesitan versiones distintas del mismo lenguaje conviven en la misma máquina sin conflicto.
  • Entrega predecible: la imagen es un artefacto versionado. Para volver a la versión anterior, basta con iniciar la imagen anterior.

¿Cuándo no hace falta Docker?#

Docker añade una capa que debes aprender y mantener: Dockerfile, imágenes, volúmenes, redes y actualización de la imagen base. Si haces el deploy de un bot o una API en una plataforma que recibe el código y entrega el entorno de ejecución listo, no necesitas escribir nada de eso. Piensa en Docker cuando debas controlar el sistema operativo, instalar paquetes que el entorno estándar no trae o repetir exactamente el mismo entorno en varios servidores.

Ten en cuenta dos cosas. Un contenedor no es una frontera de seguridad tan fuerte como una VM, porque comparte el kernel. Y Docker Desktop tiene su propia licencia: es gratuito para uso personal, educación y código abierto no comercial, pero las empresas por encima de cierto tamaño, medido en empleados o ingresos anuales, necesitan una suscripción de pago. Revisa los límites actuales en la página de licencia de Docker Desktop.

Cómo hacerlo en Square Cloud#

Square Cloud es una de esas plataformas que entregan el entorno listo. Las aplicaciones se ejecutan en contenedores aislados en un datacenter Tier 3 en Nueva York, pero no envías un Dockerfile ni una imagen propia: eliges uno de los diversos runtimes, como Node.js, Python y Go, o el de sitios estáticos, y envías tu código. Consulta los runtimes disponibles hoy en Runtimes.

El deploy puede hacerse subiendo un ZIP en el panel, con la CLI, desde GitHub (un push hace el deploy, con la GitHub Action oficial o un webhook) o con la extensión de VS Code. El archivo de configuración squarecloud.app es opcional: el panel lo genera en el deploy, con runtime, memoria y archivo principal, o lo escribes tú en la raíz del proyecto.

Los contenedores están siempre encendidos, sin cold start y con reinicio automático (activado por defecto en el deploy desde el panel) cuando el proceso termina con un error. La escala vertical depende de ti: cambias la RAM de cada aplicación en los ajustes o por la API. Mira qué incluye en las funciones de Square Cloud.

Deploy

Sube desde GitHub, la CLI o un ZIP y publica en segundos

Más información

Preguntas frecuentes

¿Docker es una máquina virtual?

No. Una máquina virtual ejecuta un sistema operativo completo con su propio kernel. Un contenedor Docker es un proceso aislado que comparte el kernel del host, por eso es más ligero.

¿Docker es gratis?

Docker Desktop es gratuito para uso personal, educación y proyectos de código abierto no comerciales. Las empresas por encima de cierto tamaño, medido en empleados o ingresos anuales, necesitan una suscripción de pago. Los límites actuales están en la página de licencia de Docker.

¿Cuál es la diferencia entre imagen y contenedor?

La imagen es una plantilla de solo lectura con las instrucciones para crear un contenedor. El contenedor es una instancia ejecutable de esa imagen. De una misma imagen puedes crear varios contenedores.

¿Necesito Docker para publicar mi aplicación?

No necesariamente. Muchas plataformas reciben el código y entregan el entorno de ejecución listo. Docker tiene sentido cuando necesitas controlar el sistema y sus dependencias o repetir el mismo entorno en varios lugares.

¿Docker funciona en Windows y macOS?

Sí, mediante Docker Desktop. En Linux instalas Docker Engine directamente.

Siguiente artículoVariables de entorno en tiempo de build vs en tiempo de ejecuciónLas variables de build quedan grabadas en el bundle; las de runtime se leen al iniciar la app. Aprende a distinguirlas y dónde guardar un secreto con seguridad.

Más en Deploy

Ver los 33 artículos