Docker के साथ C++ एप्लिकेशन का कंटेनरीकरण: चरण-दर-चरण मार्गदर्शिका

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

आपका C++ एप्लिकेशन बेहतर पैकेजिंग के योग्य है: Docker में गोता लगाएँ

\n\n

आपने C++ में एक शानदार पार्सर लिखा है जो गीगाबाइट लॉग को बिजली की गति से प्रोसेस करता है। या हो सकता है, आपने नेटवर्क सॉकेट के साथ काम करने के लिए एक उच्च-लोड माइक्रोसर्विस बनाई हो। कोड डीबग हो चुका है, सब कुछ तेज़ चल रहा है। लेकिन सच्चाई का क्षण आता है — डिप्लॉयमेंट। और फिर शुरू होता है: "तुम्हारे पास libcurl का कौन सा वर्जन है?", "प्रोडक्शन पर GLIBC एरर के साथ क्यों क्रैश हुआ?", "तुम सर्वर पर पूरा GCC क्यों इंस्टॉल कर रहे हो?"।

\n\n

परिचित लगता है? Docker के साथ C++ एप्लिकेशन के कंटेनरीकरण की दुनिया में आपका स्वागत है। अगर आप अब तक सोचते थे कि Docker सिर्फ JavaScript और Python के लिए है, तो आप बहुत कुछ मिस कर रहे हैं। वास्तव में, C++ के लिए कंटेनरीकरण एक सुपरपावर देता है: आपको एक अपरिवर्तनीय वातावरण मिलता है जहाँ बाइनरी एक बार बनती है और हर जगह काम करती है — आपके लैपटॉप से लेकर प्रोडक्शन क्लस्टर तक।

\n\n

इस लेख में, हम सिर्फ थ्योरी नहीं समझाएँगे। हम चरण-दर-चरण एक C++ एप्लिकेशन बनाएँगे, इसे Docker में पैकेज करेंगे, इमेज को न्यूनतम संभव आकार में ऑप्टिमाइज़ करेंगे और कंटेनर को घड़ी की तरह चलाएँगे। चलिए शुरू करते हैं!

\n\n

Docker C++ डेवलपर का सबसे अच्छा दोस्त क्यों है?

\n\n

बहुत से लोग मानते हैं कि C++ एप्लिकेशन को बाइनरी के रूप में वितरित करना आसान है। तकनीकी रूप से — हाँ। व्यावहारिक रूप से — यह नर्क का रास्ता है। Linux के अलग-अलग डिस्ट्रीब्यूशन, glibc के वर्जन, लाइब्रेरी की कमी, टूटी ABI संगतता — ये कुछ समस्याएँ हैं।

\n\n

Docker C++ डेवलपर की तीन मुख्य समस्याओं को हल करता है:

\n\n
    \n
  • बिल्ड की पुनरुत्पादकता: आपको ठीक-ठीक पता होता है कि कंपाइलर, CMake, Boost और अन्य डिपेंडेंसी का कौन सा वर्जन उपयोग हो रहा है। "मेरी मशीन पर काम करता है" जैसी कोई बात नहीं।
  • \n
  • आइसोलेशन: कंटेनर होस्ट सिस्टम को गंदा नहीं करता। प्रोडक्शन सर्वर पर GCC इंस्टॉल करने की ज़रूरत नहीं — न्यूनतम रनटाइम काफी है।
  • \n
  • स्केलिंग: तैयार इमेज को Kubernetes या Docker Swarm में आसानी से चलाया जा सकता है। C++ लोड को अच्छी तरह संभालता है, और Docker उस लोड को वितरित करने में मदद करता है।
  • \n
\n\n

और सबसे महत्वपूर्ण — C++ एप्लिकेशन का कंटेनरीकरण किसी जादू की माँग नहीं करता। आपको बस Docker और थोड़ा धैर्य चाहिए।

\n\n

कंटेनरीकरण के लिए एक सरल C++ एप्लिकेशन बनाना

\n\n

उदाहरण के लिए, हम "Hello, World!" नहीं, बल्कि कुछ अधिक व्यावहारिक लेंगे। मान लीजिए, हम Boost.Beast का उपयोग करके C++ में एक छोटा HTTP सर्वर लिख रहे हैं। लेकिन लेख को अधिक जटिल न बनाने के लिए, हम एक सरलीकृत संस्करण बनाएँगे — शुद्ध POSIX API पर एक सॉकेट इको सर्वर। यह दिखाएगा कि सिस्टम डिपेंडेंसी के साथ कैसे काम करना है।

\n\n

फ़ाइल server.cpp:

\n\n
#include <iostream>\n#include <string>\n#include <cstring>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n\nint main() {\n    int server_fd, new_socket;\n    struct sockaddr_in address;\n    int opt = 1;\n    int addrlen = sizeof(address);\n    char buffer[1024] = {0};\n\n    // सॉकेट बनाएँ\n    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n        perror("socket failed");\n        exit(EXIT_FAILURE);\n    }\n\n    // पोर्ट 8080 से बाइंड करें\n    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\n        perror("setsockopt");\n        exit(EXIT_FAILURE);\n    }\n    address.sin_family = AF_INET;\n    address.sin_addr.s_addr = INADDR_ANY;\n    address.sin_port = htons(8080);\n\n    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {\n        perror("bind failed");\n        exit(EXIT_FAILURE);\n    }\n\n    if (listen(server_fd, 3) < 0) {\n        perror("listen");\n        exit(EXIT_FAILURE);\n    }\n\n    std::cout << "Server listening on port 8080" << std::endl;\n\n    while (true) {\n        if ((new_socket = accept(server_fd, (struct sockaddr *)&address,\n                                 (socklen_t*)&addrlen)) < 0) {\n            perror("accept");\n            exit(EXIT_FAILURE);\n        }\n\n        read(new_socket, buffer, 1024);\n                

ब्लॉग

पुस्तक अनुशंसाएँ