Docker وC++: حاويات التطبيقات للمطور

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

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

ابدأ الدورة

Docker وC++: حاويات التطبيقات



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



لماذا Docker لـ C++؟



تعتبر تطبيقات C++ تقليديًا معقدة في النشر بسبب مشاكل قابلية نقل الملفات الثنائية بين توزيعات Linux المختلفة. يحل Docker هذه المشكلة من خلال توفير بيئة تشغيل موحدة. المزايا الرئيسية لاستخدام Docker لمشاريع C++:



  • قابلية تكرار عمليات البناء – تضمن الإصدارات الثابتة من المترجمات والمكتبات أن الكود سيُبنى بنفس الطريقة على أي جهاز.
  • عزل التبعيات – يمكن للمشاريع المختلفة استخدام إصدارات مختلفة من نفس المكتبة دون تعارضات.
  • تبسيط CI/CD – يمكن استخدام الحاوية كقطعة أثرية موحدة للاختبار والنشر.
  • تقليل الحجم – تسمح عمليات البناء متعددة المراحل بإنشاء صور صغيرة تحتوي فقط على الملف التنفيذي.


إنشاء Dockerfile لتطبيق C++



لننظر إلى مثال أساسي. لدينا تطبيق C++ بسيط يطبع "Hello, Docker!".



الكود المصدري



// main.cpp#include <iostream>

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


Dockerfile أساسي



سننشئ Dockerfile بسيطًا يستخدم صورة gcc للبناء والتشغيل:



# نستخدم صورة GCC الرسميةFROM gcc:latest

# نحدد دليل العملWORKDIR /app

# ننسخ الكود المصدريCOPY main.cpp .

# نبني التطبيقRUN g++ -o hello main.cpp

# نشغل التطبيقCMD ["./hello"]


سنبني ونشغل الحاوية:



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


الإخراج: Hello, Docker!



البناء متعدد المراحل: تحسين حجم الصورة



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



Dockerfile محسّن



# مرحلة البناءFROM gcc:latest AS builder

WORKDIR /appCOPY main.cpp .RUN g++ -static -o hello main.cpp

# المرحلة النهائيةFROM alpine:latest

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

CMD ["./hello"]


في هذا المثال، نستخدم الربط الثابت (-static) حتى لا يعتمد الملف التنفيذي على المكتبات الديناميكية. تبلغ مساحة الصورة النهائية حوالي 5 ميجابايت فقط بدلاً من 1.2 جيجابايت لصورة GCC.



حاويات مشروع مع CMake والتبعيات



عادةً ما تستخدم المشاريع الحقيقية أنظمة البناء (CMake) والتبعيات الخارجية. لننظر إلى مثال مع مكتبة nlohmann/json.



هيكل المشروع



project/├── CMakeLists.txt├── main.cpp├── external/│   └── json.hpp└── Dockerfile


CMakeLists.txt



cmake_minimum_required(VERSION 3.10)project(JsonApp)

set(CMAKE_CXX_STANDARD 17)

add_executable(app main.cpp)target_include_directories(app PRIVATE external)


main.cpp



#include <iostream>#include "json.hpp"

using json = nlohmann::json;

int main() { json data = {{"name"

المدونات

توصيات الكتب