হোস্ট মেশিনে লোকালহোস্ট মাইএসকিউএল-এর সাথে ডকারে Nginx সংযোগ করা হচ্ছে

হোস্ট মেশিনে লোকালহোস্ট মাইএসকিউএল-এর সাথে ডকারে Nginx সংযোগ করা হচ্ছে
Shell

ডকার কন্টেইনার থেকে স্থানীয় হোস্ট পরিষেবাগুলি অ্যাক্সেস করা

হোস্ট মেশিনে মাইএসকিউএল ইন্সট্যান্সের সাথে সংযোগ করার প্রয়োজনে ডকার কন্টেইনারের ভিতরে Nginx চালানো চ্যালেঞ্জিং হতে পারে, বিশেষত যখন MySQL শুধুমাত্র লোকালহোস্টের সাথে আবদ্ধ থাকে। এই সেটআপ কন্টেইনারটিকে স্ট্যান্ডার্ড নেটওয়ার্কিং পদ্ধতি ব্যবহার করে MySQL পরিষেবাতে সরাসরি অ্যাক্সেস করতে বাধা দেয়।

এই নিবন্ধটি এই ব্যবধানটি পূরণ করার জন্য বিভিন্ন সমাধানগুলি অন্বেষণ করে, যা হোস্টের লোকালহোস্টে চলমান ডকার কন্টেইনার এবং পরিষেবাগুলির মধ্যে বিরামহীন সংযোগের অনুমতি দেয়। আমরা আলোচনা করব কেন সাধারণ পদ্ধতিগুলি ছোট হতে পারে এবং কাঙ্ক্ষিত সংযোগ অর্জনের জন্য ব্যবহারিক পদক্ষেপগুলি সরবরাহ করব।

আদেশ বর্ণনা
docker network create --driver bridge hostnetwork একটি ব্রিজ ড্রাইভারের সাথে একটি কাস্টম ডকার নেটওয়ার্ক তৈরি করে, কন্টেইনারগুলিকে একই নেটওয়ার্কের মধ্যে যোগাযোগ করার অনুমতি দেয়।
host_ip=$(ip -4 addr show docker0 | grep -oP '(? হোস্টের docker0 ইন্টারফেসের IP ঠিকানা বের করে, যা কন্টেইনার থেকে হোস্ট পরিষেবাগুলিতে সংযোগ করতে ব্যবহৃত হয়।
docker exec -it nginx-container bash সরাসরি কমান্ড-লাইন অ্যাক্সেসের জন্য চলমান Nginx কন্টেইনারের ভিতরে একটি ইন্টারেক্টিভ ব্যাশ শেল কার্যকর করে।
mysql -h $host_ip -u root -p নিষ্কাশিত আইপি ঠিকানা ব্যবহার করে হোস্ট মেশিনে চলমান MySQL সার্ভারের সাথে সংযোগ করতে Nginx কন্টেইনারের ভিতরে ব্যবহৃত কমান্ড।
networks: hostnetwork: external: true বাহ্যিকভাবে তৈরি ডকার নেটওয়ার্ক ব্যবহার করতে ডকার কম্পোজে কনফিগারেশন।
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 হোস্ট মেশিনে MySQL অনুরোধ প্রক্সি করার জন্য একটি নতুন Nginx কনফিগারেশন লেখে।
nginx -s reload নতুন কনফিগারেশন পরিবর্তনগুলি প্রয়োগ করতে Nginx পরিষেবাটি পুনরায় লোড করে।

হোস্ট পরিষেবাগুলি অ্যাক্সেস করতে ডকার এবং Nginx কনফিগার করা হচ্ছে

হোস্টে চলমান একটি MySQL দৃষ্টান্তের সাথে একটি Nginx কন্টেইনার সংযোগ করতে, আমাদের প্রথমে একটি নেটওয়ার্ক সেতু স্থাপন করতে হবে। আদেশ 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, যথাক্রমে। এই সেটআপটি কন্টেইনারগুলিকে একে অপরের সাথে আবিষ্কার এবং যোগাযোগ করতে দেয়। Nginx থেকে MySQL এর সাথে সংযোগ করতে, আমাদের হোস্টের আইপি ঠিকানা প্রয়োজন, যা এর সাথে পাওয়া যেতে পারে host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). এই কমান্ড হোস্টে docker0 ইন্টারফেসের IP ঠিকানা ক্যাপচার করে।

পরবর্তী, আমরা ব্যবহার করি docker exec -it nginx-container bash Nginx পাত্রে একটি ইন্টারেক্টিভ শেল খুলতে। এখান থেকে, আমরা ব্যবহার করে একটি MySQL সংযোগ শুরু করতে পারি mysql -h $host_ip -u root -p, কোথায় $host_ip হোস্টের আইপি ঠিকানা। বিকল্পভাবে, ডকার কম্পোজ ব্যবহার করে একটি YAML ফাইলে পরিষেবা এবং নেটওয়ার্ক সংজ্ঞায়িত করে প্রক্রিয়াটিকে সহজ করে। দ্য networks: hostnetwork: external: true কনফিগারেশন নিশ্চিত করে যে পরিষেবাগুলি একটি বাহ্যিকভাবে তৈরি নেটওয়ার্ক ব্যবহার করে। অবশেষে, প্রক্সি মাইএসকিউএল অনুরোধে Nginx কনফিগার করতে, আমরা এর কনফিগারেশন ফাইলটি আপডেট করি echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf এবং Nginx ব্যবহার করে পুনরায় লোড করুন nginx -s reload. এই সেটআপটি Nginx কে হোস্টে চলমান MySQL ইন্সট্যান্সে অনুরোধ ফরোয়ার্ড করার অনুমতি দেয়।

নেটওয়ার্ক ব্রিজের মাধ্যমে হোস্টের মাইএসকিউএল-এর সাথে ডকার কন্টেইনার সংযোগ করা হচ্ছে

ডকার নেটওয়ার্ক সেটআপের জন্য শেল স্ক্রিপ্ট

# 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

Nginx এবং হোস্টের MySQL লিঙ্ক করতে ডকার কম্পোজ ব্যবহার করে

ডকার কম্পোজ 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 কনফিগার করা হচ্ছে

Nginx কনফিগারেশন এবং ডকার নেটওয়ার্ক কমান্ড

# 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

হোস্ট স্থানীয় পরিষেবাগুলিতে ডকার কন্টেইনারগুলি সংযুক্ত করা হচ্ছে৷

ডকার পাত্রে অ্যাপ্লিকেশন চালানোর সময়, নেটওয়ার্ক বিচ্ছিন্নতার কারণে হোস্টের লোকালহোস্টে আবদ্ধ পরিষেবাগুলি অ্যাক্সেস করা চ্যালেঞ্জিং হতে পারে। একটি কার্যকর পদ্ধতি হল ডকারের হোস্ট নেটওয়ার্কিং মোড ব্যবহার করা। সঙ্গে একটি ধারক শুরু করে --network host বিকল্প, কন্টেইনার হোস্টের নেটওয়ার্ক স্ট্যাক শেয়ার করে, এটি সরাসরি লোকালহোস্ট-বাউন্ড পরিষেবাগুলি অ্যাক্সেস করতে দেয়। যাইহোক, এই মোড কম পোর্টেবল এবং সব পরিবেশে ভাল কাজ নাও করতে পারে, যেমন ডকার সোয়ার্ম বা কুবারনেটস।

আরেকটি পদ্ধতি হল ডকারের অন্তর্নির্মিত DNS সমাধানকারী ব্যবহার করা, host.docker.internal. এই বিশেষ DNS নামটি হোস্টের আইপি ঠিকানার সমাধান করে, যা হোস্টের পরিষেবাগুলির সাথে যোগাযোগ করতে পাত্রে সক্ষম করে। এই পদ্ধতিটি সহজবোধ্য এবং নেটওয়ার্ক পরিচালনার জটিলতাগুলি এড়ায়। যাইহোক, এটি শুধুমাত্র উইন্ডোজ এবং ম্যাকের জন্য ডকারে উপলব্ধ, লিনাক্সে নয়। লিনাক্স ব্যবহারকারীদের জন্য, একটি কাস্টম ব্রিজ নেটওয়ার্ক তৈরি করা এবং ম্যানুয়ালি রাউটিং নিয়মগুলি কনফিগার করা একটি কার্যকর সমাধান। এই ব্যবহার জড়িত ip এবং iptables কন্টেইনার নেটওয়ার্ক থেকে হোস্টের লোকালহোস্ট ইন্টারফেসে ট্র্যাফিক রুট করার কমান্ড।

হোস্ট পরিষেবাগুলিতে ডকার কন্টেইনারগুলি সংযুক্ত করার বিষয়ে সাধারণ প্রশ্ন

  1. আমি কিভাবে ব্যবহার করব --network host ডকারে বিকল্প?
  2. সঙ্গে আপনার ধারক চালান docker run --network host হোস্টের নেটওয়ার্ক স্ট্যাক শেয়ার করতে।
  3. কি host.docker.internal?
  4. এটি একটি বিশেষ DNS নাম যা হোস্টের আইপি ঠিকানার সমাধান করে, উইন্ডোজ এবং ম্যাকের জন্য ডকারে উপলব্ধ।
  5. আমি ব্যবহার করতে পারেন host.docker.internal লিনাক্সে?
  6. না, লিনাক্সের জন্য ডকারে এই বৈশিষ্ট্যটি উপলব্ধ নয়।
  7. আমি কিভাবে একটি কাস্টম ব্রিজ নেটওয়ার্ক তৈরি করতে পারি?
  8. ব্যবহার করুন docker network create --driver bridge my-bridge-network একটি কাস্টম ব্রিজ নেটওয়ার্ক তৈরি করতে।
  9. এর উদ্দেশ্য কি iptables আদেশ?
  10. এটি লিনাক্স সিস্টেমে নেটওয়ার্ক প্যাকেট ফিল্টারিং এবং রাউটিং নিয়ম পরিচালনা করে।
  11. আমি কিভাবে একটি ডকার কন্টেইনার থেকে হোস্টে একটি MySQL উদাহরণের সাথে সংযোগ করব?
  12. ব্যবহার করুন mysql -h host.docker.internal -u root -p উইন্ডোজ/ম্যাকে ডকারের জন্য বা লিনাক্সের জন্য রাউটিং কনফিগার করুন।
  13. ব্যবহারের সীমাবদ্ধতা কি কি --network host?
  14. এটি বহনযোগ্যতা হ্রাস করতে পারে এবং কুবারনেটসের মতো কিছু অর্কেস্ট্রেটরের সাথে সামঞ্জস্যপূর্ণ নয়।
  15. আমি কি মাইএসকিউএল ছাড়াও হোস্টে অন্যান্য পরিষেবা অ্যাক্সেস করতে পারি?
  16. হ্যাঁ, একই পদ্ধতি ব্যবহার করে, আপনি হোস্টে চলমান যেকোনো পরিষেবার সাথে সংযোগ করতে পারেন।

ডকার থেকে হোস্ট পরিষেবাগুলি অ্যাক্সেস করার বিষয়ে চূড়ান্ত চিন্তাভাবনা

একটি Nginx ধারক থেকে হোস্টে একটি MySQL দৃষ্টান্তের সাথে সংযোগ করার জন্য বিভিন্ন পদ্ধতি জড়িত, প্রতিটির নিজস্ব সুবিধা এবং সীমাবদ্ধতা রয়েছে৷ হোস্ট নেটওয়ার্কিং, বিশেষ DNS নাম বা কাস্টম নেটওয়ার্ক ব্রিজ ব্যবহার করে ডকার কন্টেইনার এবং হোস্ট পরিষেবাগুলির মধ্যে মসৃণ যোগাযোগ নিশ্চিত করে, ব্যবধানটি কার্যকরভাবে পূরণ করতে পারে। এই কৌশলগুলি বোঝা এবং প্রয়োগ করে, আপনি নেটওয়ার্ক বিচ্ছিন্নতা চ্যালেঞ্জগুলি কাটিয়ে উঠতে পারেন এবং আপনার ডকারাইজড পরিবেশে শক্তিশালী সংযোগ বজায় রাখতে পারেন।