Introducción: La compilación moderna en entornos contenerizados
En el desarrollo de software, especialmente con lenguajes compilados como C, C++, C#, Java o similares, el proceso de compilación es un paso fundamental y distintivo. Tradicionalmente, esto ha implicado la instalación local de kits de desarrollo (SDK) y compiladores específicos en cada máquina de desarrollo. Sin embargo, este enfoque presenta desafíos de mantenimiento, compatibilidad y portabilidad que pueden retrasar proyectos y generar el tan temido “funciona en mi máquina”.
El auge de la virtualización ligera mediante contenedores, particularmente con Docker, ofrece una solución práctica y eficiente para estos problemas. En este artículo técnico y detallado, exploraremos cómo utilizar contenedores para compilar código de manera fácil, rápida y reproducible, eliminando la necesidad de mantener SDKs locales. Además, cubriremos las particularidades del uso en Windows y Linux y cómo configurar correctamente el flujo de trabajo.
1. ¿Por qué usar contenedores para compilar?
En lenguajes compilados, el SDK contiene herramientas esenciales como compiladores, bibliotecas y utilidades de desarrollo, mientras que las máquinas de producción solo requieren el entorno de ejecución más liviano. Utilizar contenedores para compilar nos permite:
- Evitar la instalación local de SDKs pesados y complejos.
- Garantizar consistencia en compilaciones entre distintos entornos.
- Aislar el proceso evitando conflictos con otras herramientas instaladas.
- Facilitar la automatización e integración continua junto con pipelines DevOps.
Esto es especialmente útil en equipos con múltiples desarrolladores o en entornos donde la estabilidad y replicabilidad son clave.
1.1 Lenguajes con separación clara entre compilación y ejecución
Es importante entender en qué casos esta técnica es especialmente relevante. Lenguajes como C, C++, C# y Java requieren un proceso de compilación explícito para transformar el código fuente en un ejecutable o bytecode. Por ello, necesitan un SDK para compilar y un entorno de ejecución para correr el código.
En contraste, lenguajes interpretados o con ejecución dinámica, como Node.js, Go o Python, no requieren esta separación rígida, dado que el mismo entorno se utiliza tanto para desarrollo como para ejecución.
Así, la estrategia de compilación mediante contenedores se orienta a estos lenguajes “tradicionales” que requieren SDKs especializados.
2. Fundamentos de Docker para compilación
Docker es la plataforma líder para crear, distribuir y ejecutar contenedores. Un contenedor es una unidad liviana que agrupa código, dependencias, herramientas y configuraciones necesarias para ejecutar una aplicación o tarea.
En nuestro contexto, usaremos imágenes oficiales del SDK del lenguaje en cuestión, que contienen todos los compiladores y utilidades necesarias. Esto nos permite crear contenedores efímeros que compilen nuestro código sin ensuciar nuestro sistema.
2.1 Imagen del SDK
Las imágenes de SDK contienen:
- Compiladores específicos (por ejemplo,
dotnet build
,gcc
). - Herramientas de construcción y test.
- Bibliotecas necesarias para desarrollo.
Estas imágenes están disponibles para múltiples plataformas, incluyendo Linux y Windows, y son mantenidas oficialmente, por ejemplo, por Microsoft para .NET.
2.2 Montaje de volúmenes
Para que nuestro contenedor acceda al código fuente almacenado en nuestra máquina local, usamos volúmenes. Esto permite compartir carpetas entre el host y el contenedor. Por ejemplo, el comando -v $(pwd):/code
monta el directorio actual en el contenedor dentro de /code
.

Esto es clave porque:
- Permite que el código compilado se genere en el host.
- Facilita editar el código en tu editor favorito mientras el contenedor hace la compilación.
3. Paso a paso: Compilando un proyecto con Docker
Veamos cómo aplicar esta técnica de forma práctica, tomando como ejemplo un proyecto simple con .NET, pero la misma lógica aplica para otros SDKs.
3.1 Preparar el entorno y descargar la imagen SDK
- Instalar Docker Desktop en tu máquina (docker.com/products/docker-desktop).
- Descargar la imagen oficial del SDK:
docker pull mcr.microsoft.com/dotnet/sdk
Este comando solo debe ejecutarse una vez para obtener la imagen.
3.2 Ejecutar un contenedor interactivo con el código montado
En el directorio que contiene el código fuente, ejecuta:
docker run -it -v $(pwd):/code mcr.microsoft.com/dotnet/sdk sh
Esto hace lo siguiente:
-it
: conecta el terminal para interacción.-v $(pwd):/code
: monta el directorio local al contenedor.- Ejecuta un shell
sh
dentro del contenedor.
3.3 Compilar dentro del contenedor
Ahora dentro del contenedor, cambia al directorio montado:
cd /code
Ejecuta la compilación con:
dotnet build
Se generarán los binarios en subcarpetas dentro de la carpeta montada, visibles desde el host.
3.4 Salir del contenedor
Una vez compilado, usa exit
para cerrar el contenedor interactivo. El contenedor se detendrá.
4. Manejo de diferencias entre Linux y Windows
Al usar Docker en Windows con Docker Desktop, los contenedores por defecto son Linux, pues Docker Desktop opera sobre una máquina virtual ligera basada en Linux llamada WSL2.
Esto genera una situación particular:
- El contenedor genera executables Linux.
- Estos ejecutables no funcionan directamente en Windows.
Esto puede generar confusión si se compiló un proyecto .NET en un contenedor Linux y se espera ejecutarlo directamente en Windows.

4.1 Solución: Contenedores Windows
Docker también soporta contenedores Windows que permiten generar binarios compatibles nativamente con Windows, incluyendo ejecutables .exe
.
Para utilizar contenedores Windows, hay que cambiar el modo de Docker Desktop:
- En el menú contextual de Docker Desktop, seleccionar Switch to Windows Containers.
- Luego, descargar la imagen Windows del SDK, por ejemplo:
docker pull mcr.microsoft.com/dotnet/sdk:windowsservercore-ltsc2022
4.2 Ejecutar y compilar en modo contenedor Windows
Cambia los comandos para adaptarse a Windows:
- Mapea rutas Windows (
C:/ruta/a/codigo
). - Ejecutar consola
cmd
en vez desh
.
docker run -it -v C:\ruta\a\codigo:C:\code mcr.microsoft.com/dotnet/sdk:windowsservercore-ltsc2022 cmd
Después compila con:
cd C:\code dotnet build
Los binarios generados serán ejecutables Windows, listos para correr en tu máquina.
5. Tabla comparativa: Contenedores Linux vs Windows para compilación
Característica | Contenedores Linux | Contenedores Windows |
---|---|---|
Plataforma base | Linux (WSL2 en Windows) | Windows Server Core / Nano Server |
Compatibilidad ejecutables | Genera binarios Linux | Genera binarios Windows (.exe) |
Velocidad / tamaño | Imágenes más ligeras y rápidas | Imágenes generalmente más pesadas |
Uso recomendado | Compilar para despliegues Linux | Compilar para entornos Windows |
Configuración en Windows | Docker Desktop en modo Linux (por defecto) | Se debe activar “Switch to Windows containers” |
6. Buenas prácticas para compilar código en contenedores
- Mantén tus imágenes actualizadas para aprovechar las mejoras y parches de seguridad.
- Utiliza versiones específicas de imágenes para garantizar que el entorno no cambie inesperadamente.
- Evita modificar imágenes oficiales: En su lugar, crea imágenes derivadas con un Dockerfile para personalizaciones.
- Controla los volúmenes para asegurar que el código fuente y los binarios estén sincronizados correctamente.
- Integra compilación con CI/CD para automatizar y asegurar la calidad del proceso.
7. Consideraciones avanzadas y consejos técnicos
7.1 Automatización de compilación con Dockerfile
En lugar de realizar compilaciones manuales dentro del contenedor, puedes definir un Dockerfile
que automatice:
- Copiar el código.
- Ejecutar la compilación.
- Generar una imagen final con el artefacto listo para ejecución o distribución.
Esto mejora reproducibilidad y simplifica despliegue.
7.2 Manejo de dependencias
Los contenedores mantienen las dependencias encapsuladas. Esto evita problemas clásicos como conflictos de versión o dependencias faltantes. Además, acelera el onboarding de nuevos desarrolladores que solo deberán tener Docker instalado.
7.3 Seguridad y permisos
Configura correctamente los permisos de los volúmenes para evitar bloqueos o alteraciones inesperadas del código y binarios. Además, verifica la confianza de las imágenes que usas para impedir problemas de seguridad.
8. Integración con flujos DevOps y CI/CD
La compilación con contenedores encaja perfectamente en pipelines de integración continua / entrega continua (CI/CD).
Al definir workflows automáticos en plataformas como Jenkins, GitHub Actions o GitLab CI, los contenedores de compilación aseguran que el proceso sea uniforme, evitando errores humanos y facilitando auditoría y rastreabilidad.
Para profundizar más sobre estas técnicas y ver un ejemplo práctico en vídeo, te invitamos a revisar este contenido que complementa esta guía paso a paso.

9. Glosario y palabras clave relacionadas con compilación en contenedores
Docker: Plataforma para ejecutar contenedores. Su uso permite encapsular entornos de desarrollo y producción.
Contenedor: Unidad ligera que incluye código, dependencias y configuraciones necesarias para ejecutar una tarea o aplicación.
SDK (Software Development Kit): Conjunto de herramientas para compilar, depurar y desarrollar aplicaciones en un lenguaje específico.
Volumen Docker: Mecanismo para compartir carpetas o archivos entre el host y el contenedor, permitiendo sincronización de datos.
Compilación: Proceso de traducir código fuente legible por humanos a código ejecutable o bytecode.
Entorno de ejecución: Componentes mínimos necesarios para que un programa compilado se ejecute correctamente.
Windows Containers: Contenedores que ejecutan aplicaciones Windows nativas, necesarios para compilar y correr binarios Windows en Docker.
WSL2: Subsistema de Windows para Linux, que permite correr contenedores Linux en Windows.
CI/CD: Prácticas que automatizan la integración y distribución de software, donde los contenedores aportan consistencia y reproducibilidad.
Buenas prácticas: Conjunto de recomendaciones para maximizar la productividad, seguridad y calidad del proceso de desarrollo y compilación.
10. Preguntas frecuentes (FAQ)
¿Cómo ejecutar código en un contenedor Docker?
Para ejecutar varios comandos dentro de un contenedor usando docker exec
, se puede utilizar el parámetro -c
seguido de los comandos separados por punto y coma. Por ejemplo:
docker exec -it nombre_contenedor sh -c "command1; command2; command3"
Esto ejecutará los comandos secuencialmente dentro del contenedor.

¿Cómo iniciar un contenedor Docker?
Para iniciar un contenedor que ejecute un shell interactivo, el comando es:
docker run -it nombre_imagen sh
Si quieres ejecutar un contenedor y pasarle comandos no interactivos puedes usar:
docker run nombre_imagen comando
En este último caso, el contenedor se ejecuta, procesa el comando y termina.
¿Cuánto se tarda en aprender Docker?
El tiempo de aprendizaje de Docker varía según el nivel deseado. Para un desarrollador con experiencia, dominar conceptos básicos funcionales puede tomar unos días, mientras que profundizar en orquestación, redes y almacenamiento puede requerir semanas o meses.
Lo importante es practicar creando imágenes, contenedores y familiarizarse con volúmenes y comandos comunes.
¿Cómo crear un contenedor Docker para compilación?
Ya sea para C#, Java o C++, puedes usar imágenes oficiales del SDK que contienen compiladores. El flujo general es:
- Descargar la imagen SDK con
docker pull
. - Ejecutar contenedor con montaje de código fuente.
- Ejecutar el comando de compilación dentro del contenedor.
- Salir del contenedor y usar los binarios generados.
¿Qué ventajas ofrece usar imágenes oficiales del SDK?
Las imágenes oficiales están actualizadas, son mantenidas por los proveedores y aseguran que el entorno de compilación sea consistente. Esto reduce problemas de incompatibilidad y facilita automatización.
¿Puedo usar contenedores para compilar proyectos multiplataforma?
Sí, usando contenedores específicos por plataforma (Linux, Windows). Para Windows en Docker Desktop es necesario cambiar el modo a contenedores Windows. Esto permite generar ejecutables compatibles con el sistema destino.
¿Qué hacer si el binario generado no se ejecuta en mi máquina?
Esto ocurre cuando el contenedor y el host tienen diferentes sistemas operativos. Por ejemplo, binarios Linux no se ejecutan en Windows. La solución es usar contenedores del SDK para la plataforma correcta o compilar en entornos compatibles.
¿Cómo mantener el código actualizado dentro del contenedor?
Usa volúmenes para montar el directorio local en el contenedor. Cualquier cambio que hagas en el host estará inmediatamente accesible dentro del contenedor sin necesidad de copiar manualmente.
11. Conclusión
Adoptar contenedores para el proceso de compilación de tus proyectos en lenguajes compilados no solo simplifica tu entorno local, sino que aporta consistencia, calidad y escalabilidad a tu desarrollo. Desde la descarga sencilla de imágenes oficiales hasta la ejecución rápida de compilaciones sin configurar SDKs en cada máquina, las ventajas son claras.
Además, tener en cuenta las diferencias de plataforma entre Linux y Windows garantiza que el binario final sea compatible y funcional en el entorno deseado. La integración de este modelo en pipelines de CI/CD potencia aún más su valor al automatizar y asegurar el proceso.

¿Querés mantenerte actualizado con las últimas tendencias en automatización, inteligencia artificial y transformación digital? Visitá nuestro blog de Código6 y descubrí guías, casos de éxito y noticias relevantes para potenciar tu empresa. Ingresá al blog y explorá los recursos más recientes.
Leave A Comment