Docker y C++: contenedorización de aplicaciones de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Docker y C++: contenedorización de aplicaciones de la A a la Z



La contenedorización se ha convertido en una parte esencial del desarrollo de software moderno. Docker permite empaquetar aplicaciones junto con sus dependencias, garantizando reproducibilidad y portabilidad. En este artículo, analizaremos en detalle cómo contenedorizar aplicaciones C++ con Docker, desde conceptos básicos hasta técnicas avanzadas de optimización.



1. ¿Por qué contenedorizar aplicaciones C++?



Muchos desarrolladores creen erróneamente que Docker solo es relevante para lenguajes interpretados (Python, Node.js). Sin embargo, las aplicaciones C++ también se benefician de la contenedorización:



  • Aislamiento de dependencias: las bibliotecas, compiladores y utilidades del sistema no entran en conflicto con otros proyectos
  • Reproducibilidad de compilaciones: el mismo entorno en todas las etapas (dev, CI/CD, production)
  • Simplificación del despliegue: la imagen contiene todo lo necesario para ejecutarse
  • Escalabilidad: fácil ejecución de múltiples instancias a través de Docker Compose o Kubernetes


Veamos el proceso con un ejemplo práctico.



2. Dockerfile básico para C++



Comencemos con una aplicación simple en C++. Crearemos el archivo main.cpp:



#include <iostream>

int main() { std::cout << "Hello, Dockerized C++!" << std::endl; return 0;}


Ahora escribamos un Dockerfile para compilar y ejecutar:



# Imagen base con compiladorFROM gcc:latest AS builder

WORKDIR /appCOPY main.cpp .

# CompilaciónRUN g++ -o hello main.cpp

# Imagen final mínimaFROM alpine:latest

WORKDIR /appCOPY --from=builder /app/hello .

CMD ["./hello"]


Construyamos y ejecutemos:



docker build -t cpp-hello .docker run cpp-hello


Resultado: Hello, Dockerized C++!



Explicación:

  • La primera etapa (builder) utiliza la imagen completa de gcc para compilar
  • La segunda etapa utiliza Alpine Linux mínimo para la imagen final
  • La imagen final solo contiene el binario compilado, lo que ahorra espacio


3. Compilación con CMake y dependencias



Los proyectos reales a menudo usan CMake y bibliotecas externas. Veamos un ejemplo con la biblioteca fmt.



Estructura del proyecto:



myapp/├── CMakeLists.txt├── main.cpp└── Dockerfile


CMakeLists.txt:



cmake_minimum_required(VERSION 3.14)project(MyApp)

find_package(fmt REQUIRED)

add_executable(myapp main.cpp)target_link_libraries(myapp fmt::fmt)


main.cpp:



#include <fmt/core.h>

int main() { fmt::println("Hello from {}!", "C++ with Docker"); return 0;}


Dockerfile con compilación multi-etapa:



# Etapa 1: Compilación de dependencias y aplicaciónFROM ubuntu:22.04 AS builder

RUN apt-get update && apt-get install -y \ build-essential cmake libfmt-dev \ && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY CMakeLists.txt main.cpp ./RUN cmake -B build && cmake --build build

# Etapa 2: Imagen finalFROM ubuntu:22.04

RUN apt-get update && apt-get install -y libfmt9 \ && rm -rf /var/lib/apt/lists/*

WORKDIR /appCOPY --from=builder /app/build/myapp .

CMD ["./myapp"]


Puntos importantes:

  • Las dependencias de compilación (build-essential, cmake) no llegan a la imagen final
  • Las dependencias de ejecución (libfmt9) se instalan por separado
  • El tamaño de la imagen final es significativamente menor


4. Optimización de imágenes Docker para C++



La optimización es especialmente importante para aplicaciones C++, ya que las imágenes con compiladores pueden

Blogs

Book Recommendations