डॉकर और रस्ट: प्रोडक्शन के लिए एप्लिकेशन कंटेनरीकरण

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

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

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

परिचय: रस्ट डेवलपर को डॉकर की आवश्यकता क्यों?

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

रस्ट प्रोजेक्ट्स का कंटेनरीकरण विशेष रूप से फायदेमंद है क्योंकि रस्ट एक स्टैटिक बाइनरी में कंपाइल होता है — यह न्यूनतम इमेज (alpine या scratch) बनाने की अनुमति देता है, जो Python या Node.js के समकक्षों की तुलना में तेज़ और अधिक सुरक्षित चलती हैं।



1. मूल बातें: एक सरल रस्ट एप्लिकेशन के लिए Dockerfile

हम actix-web फ्रेमवर्क का उपयोग करके रस्ट में एक सरल वेब सर्वर से शुरुआत करेंगे। एक बुनियादी Dockerfile बनाएँ।



1.1. प्रोजेक्ट संरचना

my_rust_app/├── Cargo.toml├── Cargo.lock└── src/    └── main.rs


1.2. कोड उदाहरण (main.rs)

use actix_web::{get, App, HttpResponse, HttpServer, Responder};

#[get("/")]async fn hello() -> impl Responder { HttpResponse::Ok().body("रस्ट कंटेनर से नमस्ते!")}

#[actix_web::main]async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().service(hello)) .bind("0.0.0.0:8080")? .run() .await}


1.3. सरल Dockerfile

FROM rust:1.77 AS builderWORKDIR /appCOPY Cargo.toml Cargo.lock ./RUN mkdir src && echo "fn main() {}" > src/main.rsRUN cargo build --releaseCOPY src/ src/RUN cargo build --release

FROM debian:bookworm-slimCOPY --from=builder /app/target/release/my_rust_app /usr/local/bin/EXPOSE 8080CMD ["my_rust_app"]

व्याख्या: पहला चरण (builder) एप्लिकेशन को कंपाइल करता है, दूसरा चरण केवल बाइनरी को एक साफ Debian इमेज में कॉपी करता है। इससे आकार ~2 GB से घटकर ~100 MB हो जाता है।



2. मल्टी-स्टेज बिल्ड: इमेज साइज़ का अनुकूलन

मल्टी-स्टेज बिल्ड (multi-stage build) रस्ट के लिए एक महत्वपूर्ण तकनीक है। यह बिल्ड वातावरण (कंपाइलर, निर्भरताओं के साथ) को रनटाइम वातावरण से अलग करने की अनुमति देता है।



2.1. कैशिंग के साथ उन्नत Dockerfile

बार-बार बिल्ड को गति देने के लिए, निर्भरताओं को कैश करें:

FROM rust:1.77 AS builderWORKDIR /appCOPY Cargo.toml Cargo.lock ./RUN mkdir src && echo "fn main() {}" > src/main.rsRUN cargo build --release 2>/dev/null || trueCOPY src/ src/RUN cargo build --release && \    cp target/release/my_rust_app /app/rust_app

FROM gcr.io/distroless/cc-debian12COPY --from=builder /app/rust_app /app/rust_appEXPOSE 8080CMD ["/app/rust_app"]

distroless क्यों? distroless इमेज में केवल glibc और बुनियादी लाइब्रेरीज़ होती हैं — बिना shell, apt, ls के। यह सुरक्षा बढ़ाता है और आकार को ~30 MB तक कम करता है।



2.2. scratch पर न्यूनतम इमेज

यदि आपका एप्लिकेशन libc का उपयोग नहीं करता है (उदाहरण के लिए, #![no_std] के साथ लिखा गया है), तो आप scratch का उपयोग कर सकते हैं:

FROM rust:1.77 AS builderWORKDIR /appCOPY . .RUN cargo build --release

FROM scratchCOPY --from=builder /app/target/release/my_rust_app /appEXPOSE 8080CMD ["/app"]

ऐसी इमेज का वजन 10 MB से भी कम होता है!



3. Docker Compose: मल्टी-कंटेनर एप्लिकेशन

अक्सर रस्ट एप्लिकेशन PostgreSQL, Redis या Nginx के साथ मिलकर काम करता है। docker-compose.yml का उपयोग करें:



3.1. docker-compose.yml का उदाहरण

version: '3.8'services:  app:    build: .    ports:      - "8080:8080"    environment:      - DATABASE_URL=postgres://user:pass@db:5432/mydb      - RUST_LOG=info    depends_on:      - db

db: image: postgres:16-alpine

ब्लॉग

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