Docker وC++: حاويات التطبيقات من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Docker وC++: حاويات التطبيقات من الألف إلى الياء



أصبحت الحاويات جزءًا لا يتجزأ من تطوير البرمجيات الحديثة. يتيح Docker تغليف التطبيقات مع تبعياتها، مما يضمن قابلية التكرار والنقل. في هذه المقالة، سنشرح بالتفصيل كيفية حاويات تطبيقات C++ باستخدام Docker - من المفاهيم الأساسية إلى تقنيات التحسين المتقدمة.



1. لماذا نحتاج إلى حاويات لتطبيقات C++؟



يعتقد العديد من المطورين خطأً أن Docker مناسب فقط للغات المفسرة (Python, Node.js). ومع ذلك، تستفيد تطبيقات C++ أيضًا من الحاويات:



  • عزل التبعيات: المكتبات والمترجمات والأدوات النظامية لا تتعارض مع المشاريع الأخرى
  • قابلية تكرار البناء: بيئة متطابقة في جميع المراحل (dev, CI/CD, production)
  • تبسيط النشر: تحتوي الصورة على كل ما هو ضروري للتشغيل
  • قابلية التوسع: سهولة تشغيل مثيلات متعددة عبر Docker Compose أو Kubernetes


دعنا نستعرض العملية بمثال عملي.



2. Dockerfile أساسي لـ C++



لنبدأ بتطبيق بسيط بلغة C++. لننشئ ملف main.cpp:



#include <iostream>

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


الآن لنكتب Dockerfile للبناء والتشغيل:



# صورة أساسية مع المترجمFROM gcc:latest AS builder

WORKDIR /appCOPY main.cpp .

# الترجمةRUN g++ -o hello main.cpp

# الصورة النهائية المصغرةFROM alpine:latest

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

CMD ["./hello"]


لنقم بالبناء والتشغيل:



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


النتيجة: Hello, Dockerized C++!



الشرح:

  • المرحلة الأولى (builder) تستخدم صورة gcc الكاملة للترجمة
  • المرحلة الثانية تستخدم Alpine Linux المصغر للصورة النهائية
  • تحتوي الصورة النهائية فقط على الملف الثنائي المترجم - مما يوفر المساحة


3. البناء باستخدام CMake والتبعيات



غالبًا ما تستخدم المشاريع الحقيقية CMake والمكتبات الخارجية. لنستعرض مثالاً باستخدام مكتبة fmt.



هيكل المشروع:



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 مع بناء متعدد المراحل:



# المرحلة 1: بناء التبعيات والتطبيقFROM 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

# المرحلة 2: الصورة النهائيةFROM 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"]


نقاط مهمة:

  • تبعيات البناء (build-essential, cmake) لا تدخل في الصورة النهائية
  • تبعيات وقت التشغيل (libfmt9) تُثبت بشكل منفصل
  • حجم الصورة النهائية أصغر بكثير


4. تحسين صور Docker لتطبيقات C++



التحسين مهم بشكل خاص لتطبيقات C++، حيث أن الصور التي تحتوي على مترجمات يمكن أن تكون كبيرة جدًا.

المدونات

توصيات الكتب