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

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

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

ابدأ الدورة

Docker و Rust: حاويات التطبيقات على مستوى متقدم

\n\n

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

\n\n

1. البناء متعدد المراحل: فصل بيئة البناء عن بيئة التنفيذ

\n\n

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

\n\n

لننظر إلى Dockerfile أساسي لتطبيق Rust:

\n\n
# المرحلة 1: البناء\nFROM rust:1.78-slim-bookworm AS builder\n\nWORKDIR /app\n\n# نسخ ملفات البيان لتخزين التبعيات مؤقتًا\nCOPY Cargo.toml Cargo.lock ./\nRUN mkdir src && echo "fn main() {}" > src/main.rs\nRUN cargo build --release 2>/dev/null || true\n\n# نسخ الكود المصدري الفعلي\nCOPY src ./src\nRUN cargo build --release --locked\n\n# المرحلة 2: التنفيذ\nFROM debian:bookworm-slim AS runtime\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    ca-certificates \\\n    && rm -rf /var/lib/apt/lists/*\n\nCOPY --from=builder /app/target/release/myapp /usr/local/bin/myapp\n\nUSER 1000:1000\nEXPOSE 8080\nCMD ["myapp"]
\n\n

هذا الأسلوب يوفر ميزتين رئيسيتين:

\n
    \n
  • حجم الصورة الأدنى: الصورة النهائية تحتوي فقط على الملف الثنائي والمكتبات النظامية.
  • \n
  • الأمان: يتم تقليل سطح الهجوم بسبب عدم وجود المترجم والأدوات الزائدة.
  • \n
\n\n

2. Distroless و Scratch: التصغير الشديد

\n\n

لتطبيقات Rust التي لا تتطلب مكتبات نظامية (مثل المترجمة بشكل ثابت)، يمكن استخدام صورة scratch - صورة فارغة. ومع ذلك، تستخدم معظم المشاريع libc، لذلك يُوصى باستخدام gcr.io/distroless/cc أو gcr.io/distroless/static.

\n\n

مثال مع distroless:

\n\n
# مرحلة البناء (مماثلة للسابقة)\nFROM rust:1.78-slim-bookworm AS builder\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nRUN mkdir src && echo "fn main() {}" > src/main.rs\nRUN cargo build --release 2>/dev/null || true\nCOPY src ./src\nRUN cargo build --release --locked\n\n# مرحلة التنفيذ: distroless\nFROM gcr.io/distroless/cc-debian12:latest\n\nCOPY --from=builder /app/target/release/myapp /myapp\n\nUSER 1000:1000\nEXPOSE 8080\nENTRYPOINT ["/myapp"]
\n\n

مزايا distroless:

\n
    \n
  • الحجم: تزن الصورة 10-20 ميجابايت بدلاً من 100+ ميجابايت.
  • \n
  • الأمان: عدم وجود shell أو مدير حزم أو أدوات أخرى.
  • \n
  • التوافق: تحتوي صور distroless على مجموعة أدنى من المكتبات (libc, libssl إلخ).
  • \n
\n\n

إذا كان تطبيقك يستخدم #![no_std] أو الترجمة الثابتة مع musl، يمكنك استخدام scratch:

\n\n
# البناء مع musl\nFROM rust:1.78-slim-bookworm AS builder\nRUN rustup target add x86_64-unknown-linux-musl\nWORKDIR /app\n# ... النسخ والبناء\nRUN cargo build --release --target x86_64-unknown-linux-musl --locked\n\nFROM scratch\nCOPY --from=builder /app/target/x86_64-unknown-linux-musl/release/myapp /myapp\nEXPOSE 8080\nENTRYPOINT ["/myapp"]
\n\n

3. تحسين التخزين المؤقت وتسريع البناء

\n\n

على المستوى المتقدم، من المهم استخدام ذاكرة التخزين المؤقت لـ Docker بأقصى كفاءة. النهج القياسي هو نسخ Cargo.toml و Cargo.lock قبل الكود المصدري. ولكن هناك تقنيات أكثر دقة:<

المدونات

توصيات الكتب