डॉकर और रस्ट: उन्नत स्तर के अनुप्रयोगों का कंटेनरीकरण

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

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

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

डॉकर और रस्ट: उन्नत स्तर के अनुप्रयोगों का कंटेनरीकरण



डॉकर की मदद से रस्ट अनुप्रयोगों का कंटेनरीकरण केवल कोड को इमेज में पैकेज करना नहीं है। उन्नत स्तर पर, यह न्यूनतम, तेज़ और सुरक्षित कंटेनर बनाने की कला है जो प्रोडक्शन वातावरण के लिए पूरी तरह उपयुक्त होते हैं। रस्ट, एक सिस्टम प्रोग्रामिंग भाषा के रूप में, नेटिव कोड में कंपाइल होता है, जो डॉकर इमेज को अनुकूलित करने के लिए अद्वितीय अवसर प्रदान करता है। इस लेख में, हम उन तकनीकों पर चर्चा करेंगे जो बुनियादी docker build से परे हैं, और दिखाएंगे कि रस्ट अनुप्रयोगों के लिए कुशल कंटेनर कैसे बनाएं।



1. रस्ट के लिए मल्टी-स्टेज बिल्ड



मल्टी-स्टेज बिल्ड उन्नत कंटेनरीकरण की आधारशिला है। यह बिल्ड वातावरण (कंपाइलर, निर्भरताओं और टूल्स के साथ) को अंतिम इमेज से अलग करने की अनुमति देता है, जिसमें केवल कंपाइल किया गया बाइनरी फ़ाइल और आवश्यक runtime-निर्भरताएँ होती हैं।



actix-web पर वेब सर्वर के लिए Dockerfile का एक उदाहरण देखें:



# चरण 1: बिल्डFROM rust:1.75-slim-bullseye AS builder

WORKDIR /app

# लेयर कैशिंग के लिए केवल निर्भरता फ़ाइलें कॉपी करेंCOPY Cargo.toml Cargo.lock ./

# निर्भरताओं को कंपाइल करने के लिए एक खाली main.rs बनाएँRUN mkdir src && echo "fn main() {}" > src/main.rsRUN cargo build --release 2>/dev/null || true

# अब वास्तविक स्रोत कोड कॉपी करेंCOPY src ./src

# केवल बदली हुई फ़ाइलों को पुनः कंपाइल करें (निर्भरता कैश अप्रभावित रहता है)RUN cargo build --release

# चरण 2: अंतिम इमेजFROM debian:bullseye-slim

RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ libssl1.1 \ && rm -rf /var/lib/apt/lists/*

COPY --from=builder /app/target/release/my_app /usr/local/bin/my_app

USER nobodyEXPOSE 8080

CMD ["/usr/local/bin/my_app"]


मुख्य अनुकूलन:

  • निर्भरता कैशिंग: पहले केवल Cargo.toml और Cargo.lock कॉपी किए जाते हैं, फिर निर्भरताएँ कंपाइल की जाती हैं। यदि मेनिफेस्ट फ़ाइलें नहीं बदली हैं, तो यह डॉकर को लेयर कैश का उपयोग करने देता है।
  • न्यूनतम अंतिम इमेज: पूर्ण रस्ट इमेज के बजाय debian:bullseye-slim का उपयोग किया जाता है। इससे आकार ~1.5 जीबी से घटकर ~150 एमबी हो जाता है।
  • सुरक्षा: एप्लिकेशन रूट के बजाय nobody उपयोगकर्ता के रूप में चलाया जाता है।


2. इमेज आकार को न्यूनतम करना: Alpine से scratch तक



रस्ट अनुप्रयोगों को Java वर्चुअल मशीन या Python इंटरप्रेटर जैसे runtime-वातावरण की आवश्यकता नहीं होती है। यह न्यूनतम बेस इमेज का उपयोग करने की अनुमति देता है।



Alpine Linux के साथ विकल्प:

FROM alpine:3.19 AS builderRUN apk add --no-cache musl-dev# ... बिल्ड ...

FROM alpine:3.19RUN apk add --no-cache ca-certificatesCOPY --from=builder /app/target/release/my_app /my_appCMD ["/my_app"]


scratch (खाली इमेज) के साथ विकल्प:

FROM alpine:3.19 AS builderRUN apk add --no-cache musl-dev# स्टैटिक लिंकिंग के साथ बिल्डRUN cargo build --release --target x86_64-unknown-linux-musl

FROM scratchCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/my_app /my_appCOPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/CMD ["/my_app"]


इमेज आकारों की तुलना:

  • debian:bullseye-slim: ~80-150 एमबी (सिस्टम लाइब्रेरीज़ की संख्या पर निर्भर करता है)
  • alpine:3.19: ~10-20 एमबी (glibc के बजाय musl libc का उपयोग करता है)
  • scratch: ~5-10 एमबी (केवल बाइनरी और प्रमाणपत्र)


महत्वपूर्ण: scratch का उपयोग करते समय सुनिश्चित करें कि आपका एप्लिकेशन डायनामिक लाइब्रेरीज़ की आवश्यकता नहीं रखता है। इसके लिए, लक्ष्य के साथ स्टैटिक लिंकिंग का उपयोग करें

ब्लॉग

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