Docker وRust: حاويات التطبيقات بلغة Rust

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

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

ابدأ الدورة

مقدمة: لماذا يعتبر Docker و Rust ثنائيًا مثاليًا

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



1. أساسيات Docker لمطور Rust

Docker هي منصة لتطوير التطبيقات وتسليمها وتشغيلها في حاويات. تحتوي الحاوية على التطبيق نفسه وكل ما يلزم لتشغيله: المكتبات والأدوات النظامية والإعدادات. بالنسبة لـ Rust، هذا مهم بشكل خاص، لأن الملف الثنائي المُجمّع لا يعتمد على بيئة تشغيل (على عكس Python أو Node.js)، مما يسمح بإنشاء صور صغيرة جدًا.

المكونات الرئيسية التي ستحتاجها:

  • Dockerfile — ملف نصي يحتوي على تعليمات بناء الصورة.
  • .dockerignore — ملف لاستبعاد الملفات غير الضرورية من سياق البناء.
  • Docker Compose (اختياري) — لتنسيق عمل عدة حاويات.

قبل البدء، تأكد من تثبيت Docker Desktop أو Docker Engine.

2. إنشاء Dockerfile لتطبيق Rust

لنأخذ مثالاً بسيطًا لخادم ويب بلغة Rust باستخدام إطار العمل actix-web. ملفنا الرئيسي main.rs يبدو كالتالي:

use actix_web::{web, App, HttpServer, Responder};

async fn index() -> impl Responder { "Hello, Docker and Rust!"}

#[actix_web::main]async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new().route("/", web::get().to(index)) }) .bind("0.0.0.0:8080")? .run() .await}

الآن سنقوم بإنشاء Dockerfile. التقنية الأهم هنا هي البناء متعدد المراحل (multi-stage build). تسمح هذه التقنية أولاً ببناء التطبيق في بيئة تحتوي على مجموعة كاملة من أدوات Rust، ثم نسخ الملف الثنائي النهائي إلى صورة نهائية ضئيلة الحجم.

// ---- المرحلة الأولى: البناء ----FROM rust:1.75 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

// ---- المرحلة الثانية: الصورة النهائية ----FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*

WORKDIR /app

// نسخ الملف الثنائي من المرحلة الأولىCOPY --from=builder /app/target/release/my_rust_app .

EXPOSE 8080

CMD ["./my_rust_app"]

لاحظ الحيلة باستخدام ملف main.rs فارغ. هذا يسمح لـ Docker بتخزين التبعيات المُجمّعة (crates) مؤقتًا وعدم إعادة بنائها في كل مرة تقوم فيها بتغيير الكود المصدري فقط. هذا يسرّع عمليات البناء المتكررة بشكل كبير.

2.1. تحسين حجم الصورة

الصورة النهائية المبنية على debian:bookworm-slim تزن حوالي 80-100 ميجابايت. ومع ذلك، إذا كنت ترغب في الحصول على صورة ضئيلة حقًا، يمكنك استخدام scratch (صورة فارغة) أو alpine. بالنسبة لتطبيقات Rust المُجمّعة بشكل ثابت (statically compiled)، هذا هو الخيار المثالي. للقيام بذلك، تحتاج إلى تغيير target البناء:

// في المرحلة الأولى (builder):RUN rustup target add x86_64-                

المدونات

توصيات الكتب