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

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

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

ابدأ الدورة

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



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



1. البناء متعدد المراحل (Multi-stage build) لـ Rust



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



لنلقِ نظرة على مثال Dockerfile لخادم ويب باستخدام actix-web:



# المرحلة 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 أولاً، ثم تجميع التبعيات. هذا يسمح لـ Docker باستخدام ذاكرة التخزين المؤقت للطبقات إذا لم تتغير ملفات البيان.
  • صورة نهائية صغيرة: استخدام debian:bullseye-slim بدلاً من صورة Rust الكاملة. هذا يقلل الحجم من ~1.5 جيجابايت إلى ~150 ميجابايت.
  • الأمان: يتم تشغيل التطبيق كمستخدم nobody وليس كجذر.


2. تقليل حجم الصورة: من Alpine إلى scratch



تطبيقات Rust لا تتطلب بيئة تشغيل مثل آلة Java الافتراضية أو مفسر Python. هذا يسمح باستخدام صور أساسية صغيرة.



الخيار مع 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 ميجابايت (يستخدم musl libc بدلاً من glibc)
  • scratch: ~5-10 ميجابايت (الملف الثنائي والشهادات فقط)


هام: عند استخدام scratch، يجب التأكد من أن تطبيقك لا يتطلب مكتبات ديناميكية. لهذا، استخدم الربط الثابت مع الهدف

المدونات

توصيات الكتب