Construye tu entorno de desarrollo con Docker y VS Code Remote Containers
¿Cansado de que tu máquina host se parezca a un cajón de cables enredados? Hoy vamos a aislar el caos en un contenedor y volver a respirar código sin miedo al “works on my machine”.
Índice
- Prerrequisitos
- Dockerfile: la receta del entorno
- Archivo .devcontainer
- Ejecutar y depurar
- Conclusión
Prerrequisitos
Antes de lanzarte a la piscina de los contenedores, asegura que tienes:
- Docker instalado y funcionando.
- VS Code con la extensión Remote - Containers.
- Un proyecto (Node.js o Python) que quieras encapsular.
Tip: Si Docker tarda más que tu café en cargarse, revisa que docker run hello-world funcione sin errores.
Dockerfile: la receta del entorno
El corazón del contenedor es el Dockerfile. Vamos a crear uno sencillo que sirva para cualquier proyecto JavaScript.
# syntax=docker/dockerfile:1
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --silent
COPY . .
CMD ["npm", "run", "dev"]
Explicación relámpago:
FROM node:20-alpinenos da una base ligera con Node.js 20.WORKDIR /appestablece el directorio de trabajo.- Copiamos primero los
package.jsonypackage-lock.jsonpara aprovechar la caché de Docker. npm ciinstala dependencias sin sorpresas.- El
CMDfinal lanza el scriptdevque tupackage.jsondebería definir.
Archivo .devcontainer
VS Code necesita saber cómo conectarse al contenedor. Lo hacemos con dos archivos dentro de una carpeta .devcontainer:
devcontainer.json: configuración de la extensión.docker-compose.yml(opcional): para servicios múltiples.
Vamos a crear solo el devcontainer.json por ahora:
{
"name": "DevLoop Container",
"dockerFile": "Dockerfile",
"context": "..",
"runArgs": ["-u", "node"],
"extensions": [
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode"
],
"postCreateCommand": "npm run build",
"settings": {
"terminal.integrated.shell.linux": "/bin/sh"
}
}
Detalles que valen oro:
dockerFileapunta al Dockerfile que acabamos de escribir.extensionsinstala automáticamente herramientas de lint y format.postCreateCommandejecuta una compilación una vez que el contenedor arranca.
Ejecutar y depurar
Con todo en su sitio, abre la carpeta raíz del proyecto en VS Code y pulsa F1 → Remote-Containers: Reopen in Container. VS Code construirá la imagen (solo la primera vez) y abrirá una ventana conectada al contenedor.
Una vez dentro, puedes lanzar el debugger de Node como siempre: F5 → Attach to Node Process. El contenedor expone el puerto 9229 automáticamente, así que los breakpoints funcionan sin mover nada.
Si tu proyecto necesita una base de datos, añade un servicio en docker-compose.yml y referencia dependsOn en devcontainer.json. VS Code lo levanta junto al contenedor de código.
Conclusión
Has convertido tu “funciona en mi máquina” en un “funciona en cualquier máquina” con tan sólo tres ficheros. La ventaja es doble: menos “cáscaras de huevo” en el repositorio y una puesta en marcha que parece magia. La próxima vez que alguien te pida un entorno, envíales el .devcontainer y observa cómo sus caras cambian de “¿otra reunión?” a “¡Ya puedo codear!”.