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.
¿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 comodocker runal 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:
docker run --rm hello-worldDocker 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:
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:
FROMdefine la imagen base. Todo Dockerfile empieza por ella. Si no indicas la etiqueta, Docker asumelatest, así que indica siempre una.lts-slimsigue la versión LTS activa de Node.js; para builds totalmente reproducibles, fija también la versión mayor.WORKDIRdefine la carpeta de trabajo de las instrucciones siguientes y la crea si no existe.COPYyRUNcrean capas. Copiarpackage*.jsone 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.EXPOSEsolo documenta el puerto. No publica nada.CMDes 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:
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:
docker volume create datos
docker run -d -v datos:/var/lib/data mi-imagenLa 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
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.
Más en Deploy
Ver los 33 artículos- Qué son las variables de entornoLas variables de entorno son pares clave-valor que el sistema operativo entrega a un proceso al iniciar. Aprende a leerlas en Node.js y Python sin exponer tokens.
- Qué es un deploy o despliegueUn deploy o despliegue lleva una versión de tu código a un servidor, la prepara y la pone en marcha. Conoce las etapas, los métodos y cómo hacer rollback.
- ¿Cuánta RAM y CPU necesita mi aplicación?Dimensiona RAM y CPU midiendo el pico real de la aplicación y sumando un margen del 30%. Mira cómo medir en Node.js, Python y Java y qué hacer cuando falte.
- Deploy automático con GitHub ActionsEl deploy automático con GitHub Actions envía tu código al servidor en cada push. Mira el workflow paso a paso, los secrets, las pruebas y los errores comunes.