EXPOSE
تعليمة EXPOSE — توثيق المنفذ EXPOSE
EXPOSE توثّق أي منفذ يستمع عليه تطبيقك داخل الحاوية — توثيق فقط، لا تفتح المنفذ فعليًا ولا تغني عن -p عند التشغيل.
أشهر سوء فهم في Dockerfile: EXPOSE 3000 لا تجعل المنفذ متاحًا من خارج الحاوية بأي شكل — هي مجرّد توثيق يخبر من يقرأ الصورة (أو أدوات مثل docker run -P التي تربط المنافذ الموثَّقة تلقائيًا لمنافذ عشوائية على المضيف) أي منفذ يستمع عليه التطبيق. للوصول الفعلي من جهازك، تحتاج دائمًا -p <host>:<container> صريحة عند docker run بغضّ النظر عن وجود EXPOSE أو غيابها.
تقبل تحديد البروتوكول (tcp الافتراضي أو udp)، وتقدر تكرّرها لأكثر من منفذ في نفس الملف.
الصياغة
EXPOSE <port>[/<protocol>]
📄 مثال
FROM node:20-alpine WORKDIR /app COPY . . EXPOSE 3000 CMD ["node", "server.js"] # EXPOSE وحدها لا تكفي — لازم: # docker run -p 3000:3000 myapp
أهم النقاط
| الخيار | الوظيفة |
|---|---|
| EXPOSE 80 | TCP افتراضيًا، توثيق فقط |
| EXPOSE 80/udp | يوثّق منفذ UDP صراحة |
| docker run -P | تربط تلقائيًا كل منافذ EXPOSE الموثَّقة بمنافذ عشوائية على المضيف |
💡 نصائح عملية
- استخدم EXPOSE دائمًا حتى لو لن تعتمد عليها فعليًا — توثيق مفيد لأي شخص يقرأ الـ Dockerfile لاحقًا
- لا تعتمد على EXPOSE للتحقق من أن التطبيق فعلًا يستمع على ذلك المنفذ — تحقّق بـ docker logs أو healthcheck
⚠️ أخطاء شائعة
- توقّع أن EXPOSE 3000 وحدها كافية للوصول للتطبيق من المتصفح — لن تعمل بدون -p صريحة عند التشغيل
- نسيان تحديث EXPOSE بعد تغيير منفذ التطبيق فعليًا في الكود، فيصبح التوثيق مضلِّلًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DOCKER الكامل بالعربي.