ربط Nginx في Docker بـ Localhost MySQL على الجهاز المضيف

ربط Nginx في Docker بـ Localhost MySQL على الجهاز المضيف
Shell

الوصول إلى خدمات Localhost من حاويات Docker

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

تستكشف هذه المقالة حلولاً متنوعة لسد هذه الفجوة، مما يسمح بالاتصال السلس بين حاويات Docker والخدمات التي تعمل على المضيف المحلي للمضيف. سنناقش سبب فشل الطرق الشائعة وسنقدم خطوات عملية لتحقيق الاتصال المطلوب.

يأمر وصف
docker network create --driver bridge hostnetwork إنشاء شبكة Docker مخصصة مع برنامج تشغيل جسر، مما يسمح للحاويات بالاتصال داخل نفس الشبكة.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? يستخرج عنوان IP الخاص بواجهة docker0 الخاصة بالمضيف، والذي يُستخدم للاتصال من الحاوية بخدمات المضيف.
docker exec -it nginx-container bash ينفذ قذيفة bash تفاعلية داخل حاوية Nginx قيد التشغيل للوصول المباشر إلى سطر الأوامر.
mysql -h $host_ip -u root -p الأمر المستخدم داخل حاوية Nginx للاتصال بخادم MySQL الذي يعمل على الجهاز المضيف باستخدام عنوان IP المستخرج.
networks: hostnetwork: external: true التكوين في Docker Compose لاستخدام شبكة Docker التي تم إنشاؤها خارجيًا.
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" >echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf يكتب تكوين Nginx جديدًا لتوكيل طلبات MySQL إلى الجهاز المضيف.
nginx -s reload يعيد تحميل خدمة Nginx لتطبيق تغييرات التكوين الجديدة.

تكوين Docker وNginx للوصول إلى خدمات المضيف

لتوصيل حاوية Nginx بمثيل MySQL الذي يعمل على المضيف، نحتاج أولاً إلى إنشاء جسر شبكة. الامر docker network create --driver bridge hostnetwork يقوم بإنشاء هذه الشبكة المخصصة، مما يتيح الاتصال بين الحاويات الموجودة على نفس الشبكة. ثم نبدأ تشغيل حاويات MySQL وNginx على هذه الشبكة باستخدام docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest و docker run --name nginx-container --network hostnetwork -d nginx:latest، على التوالى. يسمح هذا الإعداد للحاويات باكتشاف والتواصل مع بعضها البعض. للاتصال بـ MySQL من Nginx، نحتاج إلى عنوان IP الخاص بالمضيف، والذي يمكن الحصول عليه من خلاله host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). يلتقط هذا الأمر عنوان IP الخاص بواجهة docker0 على المضيف.

التالي نستخدم docker exec -it nginx-container bash لفتح غلاف تفاعلي في حاوية Nginx. من هنا، يمكننا بدء اتصال MySQL باستخدام mysql -h $host_ip -u root -p، أين $host_ip هو عنوان IP الخاص بالمضيف. وبدلاً من ذلك، يؤدي استخدام Docker Compose إلى تبسيط العملية من خلال تحديد الخدمات والشبكات في ملف YAML. ال networks: hostnetwork: external: true يضمن التكوين أن الخدمات تستخدم شبكة تم إنشاؤها خارجيًا. أخيرًا، لتهيئة Nginx لتوكيل طلبات MySQL، نقوم بتحديث ملف التكوين الخاص به باستخدام echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf وأعد تحميل Nginx باستخدام nginx -s reload. يسمح هذا الإعداد لـ Nginx بإعادة توجيه الطلبات إلى مثيل MySQL الذي يعمل على المضيف.

توصيل حاوية Docker بـ MySQL الخاص بالمضيف عبر Network Bridge

برنامج Shell النصي لإعداد شبكة Docker

# Create a Docker network
docker network create --driver bridge hostnetwork

# Run MySQL container with the created network
docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

# Run Nginx container with the created network
docker run --name nginx-container --network hostnetwork -d nginx:latest

# Get the host machine's IP address
host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

# Connect to MySQL from within the Nginx container
docker exec -it nginx-container bash
mysql -h $host_ip -u root -p

استخدام Docker Compose لربط Nginx وMySQL الخاص بالمضيف

تكوين Docker Compose YAML

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx-container
    networks:
      - hostnetwork

  mysql:
    image: mysql:latest
    container_name: mysql-container
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - hostnetwork

networks:
  hostnetwork:
    external: true

تكوين Nginx للاتصال باستضافة MySQL باستخدام Docker Network

تكوين Nginx وأمر شبكة Docker

# Create a bridge network
docker network create bridge-network

# Run Nginx container with bridge network
docker run --name nginx-container --network bridge-network -d nginx:latest

# Run MySQL container on the host network
docker run --name mysql-container --network host -e MYSQL_ROOT_PASSWORD=root -d mysql:latest

# Update Nginx configuration to point to MySQL host
docker exec -it nginx-container bash
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf
nginx -s reload

ربط حاويات Docker باستضافة الخدمات المحلية

عند تشغيل التطبيقات في حاويات Docker، قد يكون الوصول إلى الخدمات المرتبطة بالمضيف المحلي للمضيف أمرًا صعبًا بسبب عزل الشبكة. أحد الأساليب الفعالة هو استخدام وضع الشبكة المضيفة لـ Docker. عن طريق بدء حاوية مع --network host الخيار، تشارك الحاوية مكدس شبكة المضيف، مما يسمح لها بالوصول إلى الخدمات المرتبطة بالمضيف المحلي مباشرة. ومع ذلك، فإن هذا الوضع أقل قابلية للنقل وقد لا يعمل بشكل جيد في جميع البيئات، مثل Docker Swarm أو Kubernetes.

هناك طريقة أخرى تتمثل في استخدام محلل DNS المدمج في Docker، host.docker.internal. يتحول اسم DNS الخاص هذا إلى عنوان IP الخاص بالمضيف، مما يمكّن الحاويات من التواصل مع الخدمات الموجودة على المضيف. هذه الطريقة واضحة ومباشرة وتتجنب تعقيدات إدارة الشبكة. ومع ذلك، فهو متاح فقط على Docker لنظامي التشغيل Windows وMac، وليس على Linux. بالنسبة لمستخدمي Linux، يعد إنشاء شبكة جسر مخصصة وتكوين قواعد التوجيه يدويًا حلاً قابلاً للتطبيق. وهذا ينطوي على استخدام ip و iptables أوامر لتوجيه حركة المرور من شبكة الحاوية إلى واجهة المضيف المحلي.

أسئلة شائعة حول ربط حاويات Docker بخدمات المضيف

  1. كيف أستخدم --network host الخيار في دوكر؟
  2. قم بتشغيل الحاوية الخاصة بك باستخدام docker run --network host لمشاركة مكدس شبكة المضيف.
  3. ما هو host.docker.internal؟
  4. إنه اسم DNS خاص يتحول إلى عنوان IP الخاص بالمضيف، وهو متاح على Docker لنظامي التشغيل Windows وMac.
  5. هل بإمكاني استخدم host.docker.internal على لينكس؟
  6. لا، هذه الميزة غير متوفرة في Docker لنظام التشغيل Linux.
  7. كيف يمكنني إنشاء شبكة جسر مخصصة؟
  8. يستخدم docker network create --driver bridge my-bridge-network لإنشاء شبكة جسر مخصصة.
  9. ما هو الغرض من iptables يأمر؟
  10. يدير تصفية حزم الشبكة وقواعد التوجيه على أنظمة Linux.
  11. كيف يمكنني الاتصال بمثيل MySQL على المضيف من حاوية Docker؟
  12. يستخدم mysql -h host.docker.internal -u root -p لـ Docker على نظامي التشغيل Windows/Mac أو تكوين التوجيه لنظام التشغيل Linux.
  13. ما هي القيود المفروضة على استخدام --network host؟
  14. قد يقلل من قابلية النقل ولا يتوافق مع بعض المنسقين مثل Kubernetes.
  15. هل يمكنني الوصول إلى خدمات أخرى على المضيف إلى جانب MySQL؟
  16. نعم، باستخدام نفس الطرق، يمكنك الاتصال بأي خدمة تعمل على المضيف.

الأفكار النهائية حول الوصول إلى خدمات المضيف من Docker

يتضمن الاتصال بمثيل MySQL على المضيف من حاوية Nginx طرقًا مختلفة، ولكل منها فوائدها وقيودها. يمكن أن يؤدي استخدام شبكة المضيف أو أسماء DNS الخاصة أو جسور الشبكة المخصصة إلى سد الفجوة بشكل فعال، مما يضمن الاتصال السلس بين حاويات Docker والخدمات المضيفة. من خلال فهم هذه الاستراتيجيات وتنفيذها، يمكنك التغلب على تحديات عزل الشبكة والحفاظ على اتصالات قوية في بيئة Dockerized الخاصة بك.