In this Article
أحدثت الحاويات ثورة في تطوير البرمجيات لأنها عالجت كثيراً من التحديات التي واجهت المبرمجين. فهي تساعد على تقديم منتجات تعمل بموثوقية واتساق عبر أنظمة وأجهزة متنوعة. وارتقى Docker بالحاويات نفسها إلى مستوى جديد، إذ جعلت المنصة بناءها وإدارتها وتشغيلها أسهل وأسرع بكثير. ويدعم Docker أيضاً استخدام بروكسيات الجهات الخارجية ويوفر عدة طرق لذلك. لماذا تقرنه بعناوين IP بديلة، وأي الطرق أنسب لحالتك تحديداً، وما الذي ينبغي فعله خطوة بخطوة؟ تابع قراءة المقال لتعرف.
لماذا تستخدم البروكسيات مع Docker
الجواب هو ضمان وصول مستقر وآمن وخاضع للتحكم إلى الإنترنت، وأحياناً لضمان الوصول من الأساس.
يحتاج Docker إلى الوصول إلى الويب لتنفيذ مهام مثل سحب الصور وتثبيت الحزم وغيرها. لكن كثيراً من شبكات الشركات لا توفر اتصالاً عادياً، إذ تكون حركة المرور الصادرة خاضعة للتحكم أو مقيّدة. والسبب هو اعتبارات الأمان، لكنها تعوق عمل المطورين مع ذلك. وأحياناً تكون البروكسيات المعتمدة هي السبيل الوحيد للوصول إلى الإنترنت وتفادي رسائل مثل “انتهت مهلة الاتصال” أو “تعذر الوصول إلى www.example.com“.
كذلك، تتطلب بعض الحالات المصادقة لاستخدام الإنترنت. ولا يدعم Docker المصادقة بنفسه، لذا يكون البروكسي الخارجي هو الحل المناسب.
قد تحتاج التطبيقات وقت التشغيل أيضاً إلى اتصال خارجي. ففي بعض الحالات، تحتاج الحاوية إلى الاتصال بواجهات API سحابية أو قواعد بيانات أو خدمات جهات خارجية وغيرها. وإذا كانت محمية بجدار ناري، فالبروكسي ضروري للوصول إلى نقاط النهاية المستهدفة.
هناك أسباب أخرى لاستخدام البروكسيات أيضاً. فقد يحل توجيه حركة المرور عبر خادم بديل مشكلات السرعة ويساعد على مراقبة حركة المرور لأغراض التسجيل والبرامج الضارة وفحص SSL وغير ذلك. كما تساعد في الحفاظ على اتساق الشبكة عبر أنواع مختلفة من الخوادم والأجهزة، وفي إخفاء المعلومات الداخلية مثل عنوان IP وطلبات DNS الداخلية وNAT، بما يوفر أماناً أفضل.
كيفية إعداد البروكسيات في Docker
توجد أربع طبقات مختلفة يمكنك إعداد البروكسيات فيها: Docker Daemon، أو Docker Engine بعبارة أخرى، وDocker Client، والحاويات، ومستوى نظام التشغيل. كما توجد طرق مختلفة لضبط البروكسيات في كل طبقة. وبحسب ما تختاره، ستتأثر أجزاء مختلفة. لكل خيار مزاياه، وينبغي أن تختار وفق حالة استخدامك. لنتناولها واحداً تلو الآخر: أيها الأنسب لكل غرض، وما الذي ينبغي فعله تحديداً.
الطبقة 1: إعداد Docker Daemon
تتحكم البروكسيات المُعدة على هذا المستوى في سحب الصور ودفعها، والوصول إلى Docker Hub والسجلات الخاصة. كما أنها مسؤولة عن الوصول إلى Docker Swarm.
متى تختار هذا الخيار:
- تحتاج إلى مرور جميع عمليات الصور عبر بروكسي؛
- تفشل أوامر مثل docker pull أو docker push؛
- يتعين عليك توجيه كل حركة المرور من جهازك عبر بروكسي الشركة؛
- لا يمكن الوصول إلى الشبكة الخارجية إلا باستخدام البروكسيات؛
- عند استخدام Docker Swarm.
هذا الخيار مستقر ويمكن التنبؤ به، وإذا كنت تستخدم Desktop فمن السهل إعداد البروكسيات عبر واجهته الرسومية. لكن في الإصدارات الأقدم (< 17.x) وبعض الإعدادات النادرة، قد تؤثر الإعدادات في جميع الحاويات، ما قد يبطئ الحاويات التي لا تستخدم الإنترنت. في الإصدارات الحديثة، لا يؤثر بروكسي Daemon في الحاويات لأن الإعدادات لا تُورَّث تلقائياً.
توجد أربع طرق لإعداد بروكسي Docker Daemon.
الطريقة 1: استخدام daemon.json
هذه الطريقة خاصة بـ Linux فقط، وهي موصى بها لهذا النظام. يمكنك إعداد سلوك البروكسي في ملف daemon.json هذا:
{
"proxies": {
"http-proxy": "http://proxy.example.com:3128",
"https-proxy": "https://proxy.example.com:3129",
"no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
بعد تعديل الملف، أعد تشغيل Docker لتفعيل التغييرات:
sudo systemctl restart docker
الطريقة 2: عبر ملف systemd إضافي
تعمل هذه الطريقة أيضاً مع Linux فقط. ويمكنك استخدامها في الوضع العادي ووضع rootless.
ابدأ بإنشاء دليل للنظام:
sudo mkdir -p /etc/systemd/system/docker.service.d
بعد ذلك، أنشئ ملفاً بالاسم /etc/systemd/system/docker.service.d/http-proxy.conf يضيف متغيرات بيئة البروكسي.
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128"
إذا كنت تستخدم خادماً يعمل بـ HTTPS، فغيّر المتغير إلى “HTTPS_PROXY”. يمكنك ضبط عدة متغيرات. ثم احفظ الملف وأعد تشغيل Docker.
sudo systemctl daemon-reload
sudo systemctl restart docker
الطريقة 3: استخدام متغيرات البيئة لـ dockerd
يتحقق Docker Daemon من متغيرات البيئة قبل التشغيل. لكن هذه الطريقة ليست الخيار الأول عادةً.
export HTTP_PROXY=...
dockerd
الطريقة 4: Docker Desktop
من الناحية التقنية، يعتمد Docker Desktop على جهاز افتراضي خفيف يعمل بنظام Linux ويستخدمه لإعداد Docker. قد تقرأ أن Docker Desktop متاح لـ Windows/macOS فقط. وهو متاح تقنياً لـ Linux أيضاً، لكنه نادر واختياري، وستظل تدير Daemon داخل VM وليس محركاً أصلياً. لذلك تبقى هذه الطريقة مفضلة لـ Windows/macOS. اتبع هذا المسار:
Docker Desktop > الإعدادات > الموارد > البروكسيات.
الطبقة 2: إعداد بروكسيات Docker Client (CLI)
يستخدم Docker Client البروكسيات لإجراء الطلبات. وينطبق ذلك على استدعاءات API التي ينفذها CLI وأوامر مثل docker login, docker pull, docker push.
متى تختار هذا الخيار:
- إذا احتجت إلى أن يصادق العميل عبر بروكسي؛
- عندما تفرض الشركة قيوداً على حركة المرور الصادرة؛
- عندما لا تحتاج إلى التأثير في Daemon أو الحاويات.
إعداد Client سريع وسهل، ولا يحتاج إلى إعادة تشغيل daemon. لكن هذه الطريقة لن تنجح إذا كنت تحتاج إلى إصلاح مشكلات الوصول أثناء بناء الحاوية أو تشغيلها، أو أخطاء دفع Daemon وسحبه.
عادةً ما تُعد Docker Client باستخدام متغيرات بيئة الصدفة.
يكون الشكل كالتالي في Linux وmacOS:
export HTTP_PROXY=http://PROXY:PORT
أو
export HTTPS_PROXY=http://PROXY:PORT
استخدم هذا في Windows:
setx HTTP_PROXY http://PROXY:PORT
ملاحظة: عند استخدام CMD في Windows، قد تظهر مشكلات. يعمل PowerShell بصورة سليمة.
توجد طريقة أخرى، لكنها نادرة الاستخدام: الإعداد لكل أمر على حدة.
HTTP_PROXY=http://PROXY docker login
الطبقة 3: بروكسي الحاوية
عند اختيار هذه الطريقة، ستستخدم التطبيقات داخل الحاويات البروكسيات. يمكنك إعداد البروكسيات لعمليات البناء أو تشغيل الحاويات معها.
متى تختار هذا الخيار:
- تحتاج الحاويات إلى اتصال خارجي؛
- تفشل عمليات البناء في تشغيل مديري الحزم؛
- تحتاج التطبيقات داخل الحاويات إلى توجيه طلبات API عبر بروكسي خارجي.
يسهل ضبطه لكل حاوية، وهو مناسب للبيئات المختلطة التي تحتاج فيها بعض الحاويات إلى بروكسيات ولا تحتاجها أخرى. كما يوفر فصلاً واضحاً عن إعدادات نظام التشغيل وdaemon. لكن سيتعين عليك إعداد البروكسيات يدوياً لكل عملية بناء وتشغيل. وليس هذا الخيار الأفضل لعمليات النشر واسعة النطاق، ويرتبط بمخاطر أمنية لأن بيانات اعتماد البروكسي قد تتسرب.
الطريقة 1: إعداد البروكسيات لكل عملية بناء
docker build \
--build-arg HTTP_PROXY=http://PROXY:PORT \
--build-arg HTTPS_PROXY=http://PROXY:PORT \
-t myimage .
الطريقة 2: استخدام Dockerfile
تضمّن ENV في Dockerfile أو متغيرات البيئة إعداداتك داخل الصورة. تنطوي هذه الطريقة على مخاطر أمنية، ولا ينبغي استخدامها لعمليات البناء.
ENV HTTP_PROXY=http://PROXY:PORT
ENV HTTPS_PROXY=http://PROXY:PORT
الطريقة 3: إعداد البروكسيات لكل تشغيل
docker run \
-e HTTP_PROXY=http://PROXY:PORT \
-e HTTPS_PROXY=http://PROXY:PORT \
image
الطريقة 4: استخدام Docker Compose
هذا خيار آمن وموصى به:
environment:
HTTP_PROXY: http://PROXY:PORT
HTTPS_PROXY: http://PROXY:PORT
NO_PROXY: "localhost,127.0.0.1"
ملاحظة: في وثائق Docker الرسمية، يُطلق اسم CLI على مفهومين مختلفين، وقد يسبب ذلك التباساً. يوجد بروكسي Docker CLI يؤثر في برنامج العميل. وتوجد أيضاً علامات Docker CLI التي تُدخل إعدادات البروكسي داخل الحاويات. وهي تؤثر في الحاويات لا في العميل. لكنك تستخدم أدوات سطر الأوامر في الحالتين.
الطبقة 4: بروكسي نظام التشغيل
يمكنك ضبطه بحيث تمر كل حركة المرور من جهازك عبر خادم بروكسي. سيؤثر ذلك في كل من Docker Daemon وDocker Client، وقد يؤثر أحياناً حتى في الحاويات وجميع التطبيقات الأخرى التي تستخدمها.
متى تستخدم هذا الخيار:
- تتطلب الشركة استخدام البروكسيات على مستوى النظام؛
- هناك تطبيقات كثيرة إلى جانب Docker تحتاج إلى بروكسيات أيضاً.
هذه الطريقة بسيطة وسريعة: تُعد البروكسيات مرة واحدة، وتعمل هذه الإعدادات مع معظم المكوّنات والتطبيقات. لكنها ليست خاصة بـ Docker، وتجعل تصحيح الأخطاء أصعب. وانتبه أيضاً إلى أن الحاويات نادراً جداً ما ترث تلك الإعدادات تلقائياً، لذا قد تحتاج إلى إعدادها بشكل منفصل.
هنا، ستجد دروساً خطوة بخطوة لإعداد البروكسيات لأنظمة تشغيل متنوعة، بما فيها macOS وWindows.
يمكنك أيضاً زيارة الوثائق الرسمية التي يوفرها Docker لمعرفة مزيد من التفاصيل عن كل طريقة وجميع المتغيرات المتاحة.
كيفية ضبط تغييرات بروكسي Docker Desktop
هل لدى Docker بروكسيات داخلية؟
يوفر Docker ما يسمى بروكسي HTTP(S) داخلياً لعمليات بناء الصور فقط، وهذا يربك البعض لأنهم يظنون أن البروكسيات الخارجية ليست ضرورية.
يُستخدم بروكسي BuildKit الداخلي للبناء فقط، وهو يسرّع الوصول ويزيل مشكلات DNS ويمنع تسرب إعدادات DNS إلى عمليات البناء. لكنه لا يساعد في إنشاء اتصالات صادرة آمنة. ولا يمكنك استخدامه بديلاً عن بروكسي.
مشكلات الإعداد الشائعة وكيفية استكشافها وإصلاحها
قد يكون إصلاح الأخطاء المتعلقة بالبروكسي في Docker صعباً بسبب طبقاته المتعددة. إليك خمساً من أكثر المشكلات شيوعاً وحلولها.
الخطأ 1: فشل Docker pull/docker push
إذا لاحظت أن سحب البروكسي يتوقف أو تنتهي مهلته أو يُرفض الاتصال، فهذا يعني أن Docker Daemon لا يعرف بروكسيك. لإصلاح ذلك، أعد البروكسيات على مستوى المحرك.
الخطأ 2: لا يوجد اتصال رغم عمل Daemon
في الوقت نفسه، يعمل الأمر docker pull، لكن الحاويات لا تستطيع تشغيل pip install والتبعيات الأخرى. قد تظهر أخطاء مثل “فشل مؤقت في الحل”. تحدث هذه الحالة في إصدارات Docker الحديثة لأن بروكسي Daemon لا يُطبّق تلقائياً داخل الحاويات. للتخلص منها، طبّق بروكسي على مستوى الحاوية في Dockerfile أو Docker Compose.
الخطأ 3: متغير NO_PROXY لا يعمل
إذا كنت لا تزال ترى أن Docker يحاول توجيه حركة المرور عبر البروكسيات رغم إعداداتك، أو إذا فشلت الحاويات في التواصل أو تعطلت مرايا السجل، فقد يرجع ذلك إلى صياغة غير صحيحة. جرّب استخدام إدخالات مفصولة بفواصل ولا تحدد البروتوكولات عند إدراج النطاقات.
NO_PROXY=localhost,127.0.0.1,.corp.example.com,registry.internal
الخطأ 4: بيانات اعتماد البروكسي تحتوي رموزاً غير مدعومة
في هذه الحالة، قد يفشل Docker في البدء أو في توجيه حركة المرور عبر البروكسيات. لحل ذلك، تحتاج إلى ترميز الرموز باستخدام URL، مثل @, #, %, :
سيبدو الأمر كالتالي:
Environment=”HTTP_PROXY=http://user:Pa%%23ss@proxy:8080″
الخطأ 5: يتجاهل Docker إعدادات بروكسي Desktop
عندما تضبط البروكسيات باستخدام Desktop ثم تفشل عمليات البناء ولا تستطيع الحاويات إنشاء اتصال، فقد يكون ذلك مؤشراً إلى ضرورة استخدام خيار إعداد آخر. يؤثر Desktop في Daemon، لكنه لا يؤثر في الحاويات مباشرةً. جرّب ضبط بروكسيات على مستوى الحاوية.
الخلاصة
يشكل Docker والبروكسيات مزيجاً قوياً يوفر السرعة والأمان والنشر الفعّال. ولتحقيق أقصى استفادة منه، تحتاج إلى اختيار الإعداد المناسب، وبالطبع بروكسيات عالية الجودة من مصادر قانونية. تدعمك DataImpulse في ذلك، إذ توفر لك أكثر من 90 مليون بروكسي من مصادر أخلاقية، إلى جانب دعم بشري على مدار 24/7 لمساعدتك في مهام التطوير. لا تتردد في مراسلتنا على [email protected] أو النقر على زر “جرّبه الآن” للبدء معنا. انقر على “جرّبه الآن” أو تواصل معنا على [email protected] للبدء.
