جارٍ تحميل الدرس...
في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
أنظمة التشغيل 2 - المعمل 09
Docker متقدم: التحسين، والمجلدات التخزينية، وCompose، ومتغيرات البيئةعمليات بناء أسرع، وHot Reload عبر الربط المباشر (bind mounts)، وCompose متعدد الحاويات، ومتغيرات البيئة
.dockerignore.gitignore، لكن لسياق بناء Docker - يستبعد الملفات من إرسالها إلى الخدمة الخلفية (daemon)node_modules، وDockerfile، و.env، و.git، و*.lognode_modules
Dockerfile
.env
.git
*.log.dockerignoreDocker طبقة كل تعليمة مؤقتا ويعيد استخدامها إذا لم يتغير شيء قبلهاCOPY package.json package-lock.json ./
RUN npm install
COPY . .FROM node:20-alpine
نادرا ما تتغير
WORKDIR /app
لا تتغير أبدا
COPY package.json
تتغير عند تغير التبعيات
RUN npm install
مخزنة مؤقتا إن لم تتغير الطبقة السابقة
COPY . .
تتغير كثيرا
CMD
نادرا ما تتغير
docker exec -it <container> bash واجهة سطر أوامر حية داخل حاوية قيد التشغيل لفحصها مباشرةnodemon تشغيل خادم Node.js تلقائيا عند تغير الملفات المراقبةBind Mounts)$(pwd) للمسار المطلق على الجهاز المضيف (%cd% على Windows) - المسارات النسبية لا تعملdocker run -d -p 4000:4000 -v $(pwd):/app my-express-appالمضيف
$(pwd) - كود المصدر
الحاوية
/app (مربوط)
nodemon
مراقب الملفات
خادم Node.js
:4000
:ro لجعله للقراءة فقط: -v $(pwd):/app:ronode_modules إن كانت مفقودة على المضيف - يحل ذلك بمجلد تخزيني مجهول (anonymous volume)docker run -d -v $(pwd):/app:ro -v /app/node_modules my-express-appمجلد تخزيني مجهول
-v /app/node_modules
ربط مباشر للقراءة فقط
-v $(pwd):/app:ro
| النوع | الصياغة | حالة الاستخدام |
|---|---|---|
ربط مباشر (Bind Mount) | -v /host:/container | مزامنة تطوير ثنائية الاتجاه |
| ربط مباشر للقراءة فقط | -v /host:/container:ro | مزامنة أكثر أمانا للكود المصدري |
مجلد تخزيني مجهول (Anonymous Volume) | -v /container | حماية node_modules |
مجلد تخزيني مسمى (Named Volume) | -v myvolume:/container | ديمومة قاعدة البيانات |
Docker ComposeCompose ويشغل إعدادات متعددة الحاويات من ملف YAML واحد، بدلا من أوامر docker build/docker run الطويلةdocker compose up -dreverse proxy) - يجب أن تتحدث مع بعضهاdocker-compose.ymlcontainer_name، وbuild، وports، وvolumes، وenvironment، وenv_file، وdepends_ondocker run -v، يقبل Compose مسارات نسبية مثل ./srcYAML حساسة لمسافات المسافة البادئة (indentation) - حافظ على مسافة بادئة متسقة للمفاتيح الفرعيةservices:
node-app:
build: .
ports:
- "4000:4000"
volumes:
- ./src:/app/src:roCompose الأساسيةdocker compose up -d - يبني إن لزم الأمر، ويشغل كل الخدمات في الخلفيةdocker compose down - يوقف الحاويات ويحذفها (أضف -v لحذف المجلدات التخزينية أيضا)docker compose logs -f <service> - يتابع سجلات خدمة معينةdocker compose exec <service> bash - يفتح واجهة سطر أوامر داخل خدمة قيد التشغيلENV في Dockerfile، و--env/-e مع docker run، و--env-file، وenvironment: المضمنة في Compose، أو env_file: في Compose.env دائما إلى كل من .gitignore و.dockerignore؛ وقدم ملف .env.example لزملاء الفريقservices:
node-app:
env_file:
- .env.dockerignore الأسرار والملفات الزائدة بعيدا عن الصور؛ وترتيب تعليمات Dockerfile بشكل صحيح يبقي عمليات البناء سريعة عبر التخزين المؤقت:ro أكثر أمانا، وتحمي المجلدات التخزينية المجهولة مجلدات مثل node_modulesDocker Compose الأوامر اليدوية الطويلة بملف YAML تصريحي واحد وأمر واحد لتشغيل كل شيءCompose المسارات النسبية ويربط الخدمات تلقائيا عبر شبكة داخلية.env وتحمل عبر env_file، لا أن ترمز داخل الصورة أبداdocker exec -it وdocker logs هما الأداتان الأساسيتان لفحص حاوية قيد التشغيلMahmoud Abas|المعمل 09: Docker المتقدم - التحسين، الأحجام (Volumes)، Compose، ومتغيرات البيئة