¡Hola developer 👋🏻!
Uno de los vídeos que más ha gustado de mi canal de YouTube es el que habla sobre Dev Containers y cómo pueden hacernos la vida mucho más sencilla. La idea es clara: contenerizar todo nuestro entorno de desarrollo y olvidarnos, de una vez por todas, del caos de tecnologías, lenguajes, versiones y dependencias con el que convivimos hoy en día.
Si todavía no lo has visto, o no sabes de qué te estoy hablando, puedes acceder al vídeo desde aquí 👇🏻
A raíz de ese contenido —y también por otras vías 🥲— varias personas me han pedido si podía compartir una configuración de Dev Container para Java. Cada vez sois más quienes estáis utilizando VS Code como entorno de desarrollo también para este lenguaje, pero es cierto que al principio puede costar un poco dejar la configuración fina.
Durante estos días he estado trasteando tanto con Spring Boot como con Quarkus y, como no podía ser de otra manera, he terminado creando mis propias configuraciones de Dev Containers para ambos frameworks, cada uno con sus… particularidades 🙃
En este artículo vamos a empezar por Spring Boot, que ha sido la parte más sencilla. En un próximo artículo te contaré la configuración de Quarkus, que me ha dado un poquito más de guerra 😅
🍃 Configuración de Dev Containers para Spring Boot
Vamos a empezar por la fácil. La configuración de Spring Boot no me ha dado demasiados problemas y tiene un aspecto como el siguiente:
{
"name": "🍃 Spring Boot Dev Environment",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"features": {
"ghcr.io/devcontainers/features/java:1": {
"version": "none",
"installMaven": "false",
"installGradle": "true"
},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
// 🐘 PostgreSQL is available at localhost:5432
"forwardPorts": [8080, 5432],
"portsAttributes": {
"8080": { "label": "🚀 Spring Boot App" },
"5432": { "label": "🐘 PostgreSQL" }
},
// ✅ Wait for DB to be ready before running commands
"postCreateCommand": "echo '🐘 PostgreSQL ready at localhost:5432 | 🗄️ DB: sports_db | 👤 User: postgres'",
"customizations": {
"vscode": {
"extensions": [
"vscjava.vscode-java-pack",
"vmware.vscode-spring-boot",
"mtxr.sqltools",
"mtxr.sqltools-driver-pg",
"vmware.vscode-boot-dev-pack"
],
"settings": {
"java.compile.nullAnalysis.mode": "automatic",
"java.jdt.ls.java.home": "/usr/lib/jvm/msopenjdk-current",
"java.configuration.runtimes": [
{
"name": "JavaSE-21",
"path": "/usr/lib/jvm/msopenjdk-current",
"default": true
}
],
"java.import.gradle.java.home": "/usr/lib/jvm/msopenjdk-current"
}
}
}
}
Como puedes ver, estoy delegando la creación de los contenedores en Docker Compose, ya que mi entorno está compuesto por dos contenedores:
- Uno para la aplicación en Spring Boot
- Otro para la base de datos PostgreSQL (que podrías cambiar sin problema por cualquier otra)
La configuración de docker-compose.yml es la siguiente:
# 🐳 Docker Compose configuration for local development
services:
# ☕ Java Development Container
app:
image: mcr.microsoft.com/devcontainers/java:1-21-bullseye
volumes:
- ../..:/workspaces:cached
command: sleep infinity
network_mode: service:db
depends_on:
db:
condition: service_healthy
# 🐘 PostgreSQL Database
db:
image: postgres:16-alpine
restart: unless-stopped
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: sports_db
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d sports_db"]
interval: 5s
timeout: 5s
retries: 5
# 💾 Persistent volumes
volumes:
postgres-data:
La configuración es bastante sencilla, pero si no tienes claro cómo funciona Docker Compose, te recomiendo este otro vídeo que grabé como parte de mi curso de Docker en YouTube 👀
Detalles importantes del Dev Container
Si vuelves a la configuración del devcontainer.json, hay algunos puntos interesantes a destacar.
Features
He añadido dos features principales:
- Java: no reinstalo Java porque la imagen que uso para el contenedor de la app ya viene con Java 21, pero sí aprovecho esta feature para instalar Gradle, que es la herramienta que suelo utilizar siempre que puedo 😅
- GitHub CLI: mis repos están en GitHub, así que tener
ghdentro del contenedor me facilita muchísimo la autenticación y la interacción con el repositorio directamente desde el Dev Container.
Port forwarding
Hago forwarding de:
- 8080 → la aplicación Spring Boot
- 5432 → la base de datos PostgreSQL
Además, añado etiquetas descriptivas para que desde la pestaña de Ports de VS Code sea muy fácil identificar qué es cada cosa.
🚨 Importante 🚨 Para poder acceder a tu aplicación debes utilizar http://127.0.0.1:8080 en lugar de localhost. De lo contrario te dará timeout.
Extensiones de VS Code
Por último, incluyo una serie de extensiones que considero básicas para trabajar cómodamente con Spring Boot:
- Extension Pack for Java: Pack esencial con soporte de lenguaje, debugging, testing, gestión de proyectos Maven/Gradle e IntelliSense.
- Spring Boot Tools: Navegación inteligente, validación y autocompletado de
application.properties/application.yml, y soporte para Live Application Information. - Spring Boot Extension Pack: Pack de VMware que agrupa Spring Boot Tools, Spring Initializr y Spring Boot Dashboard para una experiencia completa.
- SQLTools: Cliente SQL integrado en VS Code para conectarse a la base de datos, ejecutar queries y explorar tablas.
- SQLTools PostgreSQL/Cockroach Driver:Driver necesario para conectarse a la base de datos PostgreSQL incluida en el Dev Container.
🔧 Settings adicionales
También he tenido que agregar unas settings adicionales a la configuración, para que las extensiones, especialmente por la de Gradle for Java, apunten a la ruta correcta para Java Home, porque de lo contrario no encontraba correctamente el SDK.
Si eres fan de Spring Boot y quieres empezar a trabajar con Dev Containers, aquí tienes todo lo que necesitas para ponerte en marcha 🚀
Y si echas algo en falta, ¡déjamelo en los comentarios! 👇🏻
En los próximos días te compartiré la configuración de Dev Containers para Quarkus 😉
¡Nos vemos! 👋🏻

