ഹോസ്റ്റ് മെഷീനിലെ ലോക്കൽഹോസ്റ്റ് MySQL-ലേക്ക് ഡോക്കറിലെ Nginx കണക്റ്റുചെയ്യുന്നു

ഹോസ്റ്റ് മെഷീനിലെ ലോക്കൽഹോസ്റ്റ് MySQL-ലേക്ക് ഡോക്കറിലെ Nginx കണക്റ്റുചെയ്യുന്നു
Shell

ഡോക്കർ കണ്ടെയ്‌നറുകളിൽ നിന്ന് ലോക്കൽഹോസ്റ്റ് സേവനങ്ങൾ ആക്‌സസ് ചെയ്യുന്നു

ഹോസ്റ്റ് മെഷീനിൽ MySQL ഇൻസ്‌റ്റൻസിലേക്ക് കണക്റ്റുചെയ്യേണ്ടിവരുമ്പോൾ ഒരു ഡോക്കർ കണ്ടെയ്‌നറിനുള്ളിൽ Nginx പ്രവർത്തിപ്പിക്കുന്നത് വെല്ലുവിളിയാകും, പ്രത്യേകിച്ചും MySQL ലോക്കൽഹോസ്റ്റുമായി മാത്രം ബന്ധിക്കപ്പെട്ടിരിക്കുമ്പോൾ. സ്റ്റാൻഡേർഡ് നെറ്റ്‌വർക്കിംഗ് രീതികൾ ഉപയോഗിച്ച് MySQL സേവനം നേരിട്ട് ആക്‌സസ് ചെയ്യുന്നതിൽ നിന്ന് ഈ സജ്ജീകരണം കണ്ടെയ്‌നറിനെ തടയുന്നു.

ഈ വിടവ് നികത്തുന്നതിനുള്ള വിവിധ പരിഹാരങ്ങൾ ഈ ലേഖനം പര്യവേക്ഷണം ചെയ്യുന്നു, ഡോക്കർ കണ്ടെയ്‌നറുകളും ഹോസ്റ്റിൻ്റെ ലോക്കൽ ഹോസ്റ്റിൽ പ്രവർത്തിക്കുന്ന സേവനങ്ങളും തമ്മിൽ തടസ്സമില്ലാത്ത കണക്റ്റിവിറ്റി അനുവദിക്കുന്നു. പൊതുവായ രീതികൾ എന്തുകൊണ്ട് കുറയുന്നു എന്ന് ഞങ്ങൾ ചർച്ച ചെയ്യുകയും ആവശ്യമുള്ള കണക്റ്റിവിറ്റി നേടുന്നതിന് പ്രായോഗിക നടപടികൾ നൽകുകയും ചെയ്യും.

കമാൻഡ് വിവരണം
docker network create --driver bridge hostnetwork ഒരു ബ്രിഡ്ജ് ഡ്രൈവർ ഉപയോഗിച്ച് ഒരു ഇഷ്‌ടാനുസൃത ഡോക്കർ നെറ്റ്‌വർക്ക് സൃഷ്‌ടിക്കുന്നു, ഒരേ നെറ്റ്‌വർക്കിനുള്ളിൽ ആശയവിനിമയം നടത്താൻ കണ്ടെയ്‌നറുകളെ അനുവദിക്കുന്നു.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റ് സേവനങ്ങളിലേക്ക് കണക്റ്റുചെയ്യാൻ ഉപയോഗിക്കുന്ന ഹോസ്റ്റിൻ്റെ ഡോക്കർ0 ഇൻ്റർഫേസിൻ്റെ IP വിലാസം എക്‌സ്‌ട്രാക്‌റ്റ് ചെയ്യുന്നു.
docker exec -it nginx-container bash നേരിട്ടുള്ള കമാൻഡ്-ലൈൻ ആക്‌സസിനായി പ്രവർത്തിക്കുന്ന Nginx കണ്ടെയ്‌നറിനുള്ളിൽ ഒരു ഇൻ്ററാക്ടീവ് ബാഷ് ഷെൽ എക്‌സിക്യൂട്ട് ചെയ്യുന്നു.
mysql -h $host_ip -u root -p എക്‌സ്‌ട്രാക്‌റ്റുചെയ്‌ത IP വിലാസം ഉപയോഗിച്ച് ഹോസ്റ്റ് മെഷീനിൽ പ്രവർത്തിക്കുന്ന 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 സേവനം വീണ്ടും ലോഡുചെയ്യുന്നു.

ഹോസ്റ്റ് സേവനങ്ങൾ ആക്സസ് ചെയ്യുന്നതിന് ഡോക്കറും എൻജിൻക്സും കോൺഫിഗർ ചെയ്യുന്നു

ഹോസ്റ്റിൽ പ്രവർത്തിക്കുന്ന 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-ലേക്ക് കണക്റ്റുചെയ്യുന്നതിന്, ഞങ്ങൾക്ക് ഹോസ്റ്റിൻ്റെ IP വിലാസം ആവശ്യമാണ്, അത് ഉപയോഗിച്ച് ലഭിക്കും 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 ഹോസ്റ്റിൻ്റെ IP വിലാസമാണ്. പകരമായി, ഒരു YAML ഫയലിൽ സേവനങ്ങളും നെറ്റ്‌വർക്കുകളും നിർവചിച്ചുകൊണ്ട് ഡോക്കർ കമ്പോസ് ഉപയോഗിക്കുന്നത് പ്രക്രിയ ലളിതമാക്കുന്നു. ദി networks: hostnetwork: external: true സേവനങ്ങൾ ബാഹ്യമായി സൃഷ്ടിച്ച നെറ്റ്‌വർക്ക് ഉപയോഗിക്കുന്നുണ്ടെന്ന് കോൺഫിഗറേഷൻ ഉറപ്പാക്കുന്നു. അവസാനമായി, പ്രോക്സി MySQL അഭ്യർത്ഥനകളിലേക്ക് Nginx കോൺഫിഗർ ചെയ്യുന്നതിന്, ഞങ്ങൾ അതിൻ്റെ കോൺഫിഗറേഷൻ ഫയൽ അപ്ഡേറ്റ് ചെയ്യുന്നു echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf Nginx ഉപയോഗിച്ച് റീലോഡ് ചെയ്യുക nginx -s reload. ഹോസ്റ്റിൽ പ്രവർത്തിക്കുന്ന MySQL ഉദാഹരണത്തിലേക്ക് അഭ്യർത്ഥനകൾ കൈമാറാൻ ഈ സജ്ജീകരണം 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

ഡോക്കർ നെറ്റ്‌വർക്ക് ഉപയോഗിച്ച് MySQL ഹോസ്റ്റിലേക്ക് കണക്റ്റുചെയ്യുന്നതിന് 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 ഓപ്ഷൻ, കണ്ടെയ്നർ ഹോസ്റ്റിൻ്റെ നെറ്റ്‌വർക്ക് സ്റ്റാക്ക് പങ്കിടുന്നു, ഇത് ലോക്കൽഹോസ്റ്റ്-ബൗണ്ട് സേവനങ്ങൾ നേരിട്ട് ആക്സസ് ചെയ്യാൻ അനുവദിക്കുന്നു. എന്നിരുന്നാലും, ഈ മോഡ് പോർട്ടബിൾ കുറവാണ്, ഡോക്കർ സ്വാം അല്ലെങ്കിൽ കുബർനെറ്റസ് പോലുള്ള എല്ലാ പരിതസ്ഥിതികളിലും നന്നായി പ്രവർത്തിച്ചേക്കില്ല.

ഡോക്കറിൻ്റെ ബിൽറ്റ്-ഇൻ ഡിഎൻഎസ് റിസോൾവർ ഉപയോഗിക്കുന്നതാണ് മറ്റൊരു സമീപനം, host.docker.internal. ഈ പ്രത്യേക DNS നാമം ഹോസ്റ്റിൻ്റെ IP വിലാസത്തിലേക്ക് പരിഹരിക്കുന്നു, ഹോസ്റ്റിലെ സേവനങ്ങളുമായി ആശയവിനിമയം നടത്താൻ കണ്ടെയ്‌നറുകൾ പ്രാപ്‌തമാക്കുന്നു. ഈ രീതി ലളിതവും നെറ്റ്‌വർക്ക് മാനേജ്മെൻ്റിൻ്റെ സങ്കീർണതകൾ ഒഴിവാക്കുന്നതുമാണ്. എന്നിരുന്നാലും, ഇത് വിൻഡോസിനും മാക്കിനുമുള്ള ഡോക്കറിൽ മാത്രമേ ലഭ്യമാകൂ, ലിനക്സിൽ അല്ല. Linux ഉപയോക്താക്കൾക്ക്, ഒരു ഇഷ്‌ടാനുസൃത ബ്രിഡ്ജ് നെറ്റ്‌വർക്ക് സൃഷ്‌ടിക്കുകയും റൂട്ടിംഗ് നിയമങ്ങൾ സ്വമേധയാ ക്രമീകരിക്കുകയും ചെയ്യുന്നത് ഒരു പ്രായോഗിക പരിഹാരമാണ്. ഇത് ഉപയോഗിക്കുന്നത് ഉൾപ്പെടുന്നു ip ഒപ്പം iptables കണ്ടെയ്‌നർ നെറ്റ്‌വർക്കിൽ നിന്ന് ഹോസ്റ്റിൻ്റെ ലോക്കൽ ഹോസ്റ്റ് ഇൻ്റർഫേസിലേക്ക് ട്രാഫിക്ക് റൂട്ട് ചെയ്യുന്നതിനുള്ള കമാൻഡുകൾ.

ഹോസ്റ്റ് സേവനങ്ങളിലേക്ക് ഡോക്കർ കണ്ടെയ്‌നറുകൾ ബന്ധിപ്പിക്കുന്നതിനെക്കുറിച്ചുള്ള പൊതുവായ ചോദ്യങ്ങൾ

  1. ഞാൻ എങ്ങനെ ഉപയോഗിക്കും --network host ഡോക്കറിലെ ഓപ്ഷൻ?
  2. ഉപയോഗിച്ച് നിങ്ങളുടെ കണ്ടെയ്നർ പ്രവർത്തിപ്പിക്കുക docker run --network host ഹോസ്റ്റിൻ്റെ നെറ്റ്‌വർക്ക് സ്റ്റാക്ക് പങ്കിടാൻ.
  3. എന്താണ് host.docker.internal?
  4. ഇത് ഹോസ്റ്റിൻ്റെ ഐപി വിലാസം പരിഹരിക്കുന്ന ഒരു പ്രത്യേക ഡിഎൻഎസ് നാമമാണ്, വിൻഡോസിനും മാക്കിനുമുള്ള ഡോക്കറിൽ ലഭ്യമാണ്.
  5. എനിക്ക് ഉപയോഗിക്കാമോ host.docker.internal Linux-ൽ?
  6. ഇല്ല, Linux-നുള്ള ഡോക്കറിൽ ഈ ഫീച്ചർ ലഭ്യമല്ല.
  7. എനിക്ക് എങ്ങനെ ഒരു ഇഷ്‌ടാനുസൃത ബ്രിഡ്ജ് നെറ്റ്‌വർക്ക് സൃഷ്ടിക്കാനാകും?
  8. ഉപയോഗിക്കുക docker network create --driver bridge my-bridge-network ഒരു ഇഷ്‌ടാനുസൃത ബ്രിഡ്ജ് നെറ്റ്‌വർക്ക് സൃഷ്‌ടിക്കാൻ.
  9. എന്താണ് ഉദ്ദേശ്യം iptables കൽപ്പന?
  10. ഇത് ലിനക്സ് സിസ്റ്റങ്ങളിൽ നെറ്റ്‌വർക്ക് പാക്കറ്റ് ഫിൽട്ടറിംഗ്, റൂട്ടിംഗ് നിയമങ്ങൾ നിയന്ത്രിക്കുന്നു.
  11. ഒരു ഡോക്കർ കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റിലെ MySQL ഇൻസ്‌റ്റൻസിലേക്ക് എങ്ങനെ കണക്‌റ്റ് ചെയ്യാം?
  12. ഉപയോഗിക്കുക mysql -h host.docker.internal -u root -p Windows/Mac-ലെ ഡോക്കറിനായി അല്ലെങ്കിൽ Linux-നായി റൂട്ടിംഗ് കോൺഫിഗർ ചെയ്യുക.
  13. ഉപയോഗിക്കുന്നതിൻ്റെ പരിമിതികൾ എന്തൊക്കെയാണ് --network host?
  14. ഇത് പോർട്ടബിലിറ്റി കുറച്ചേക്കാം, കുബെർനെറ്റസ് പോലുള്ള ചില ഓർക്കസ്ട്രേറ്ററുകളുമായി ഇത് പൊരുത്തപ്പെടുന്നില്ല.
  15. MySQL കൂടാതെ ഹോസ്റ്റിൽ എനിക്ക് മറ്റ് സേവനങ്ങൾ ആക്സസ് ചെയ്യാൻ കഴിയുമോ?
  16. അതെ, അതേ രീതികൾ ഉപയോഗിച്ച്, നിങ്ങൾക്ക് ഹോസ്റ്റിൽ പ്രവർത്തിക്കുന്ന ഏത് സേവനത്തിലേക്കും കണക്റ്റുചെയ്യാനാകും.

ഡോക്കറിൽ നിന്ന് ഹോസ്റ്റ് സേവനങ്ങൾ ആക്സസ് ചെയ്യുന്നതിനെക്കുറിച്ചുള്ള അന്തിമ ചിന്തകൾ

ഒരു Nginx കണ്ടെയ്‌നറിൽ നിന്ന് ഹോസ്റ്റിലെ MySQL ഉദാഹരണത്തിലേക്ക് കണക്റ്റുചെയ്യുന്നത് വിവിധ രീതികൾ ഉൾക്കൊള്ളുന്നു, ഓരോന്നിനും അതിൻ്റേതായ നേട്ടങ്ങളും പരിമിതികളും ഉണ്ട്. ഹോസ്റ്റ് നെറ്റ്‌വർക്കിംഗ്, പ്രത്യേക ഡിഎൻഎസ് പേരുകൾ അല്ലെങ്കിൽ ഇഷ്‌ടാനുസൃത നെറ്റ്‌വർക്ക് ബ്രിഡ്ജുകൾ എന്നിവ ഉപയോഗിച്ച് ഡോക്കർ കണ്ടെയ്‌നറുകളും ഹോസ്റ്റ് സേവനങ്ങളും തമ്മിലുള്ള സുഗമമായ ആശയവിനിമയം ഉറപ്പാക്കാൻ ഫലപ്രദമായി വിടവ് നികത്താനാകും. ഈ തന്ത്രങ്ങൾ മനസ്സിലാക്കുകയും നടപ്പിലാക്കുകയും ചെയ്യുന്നതിലൂടെ, നിങ്ങൾക്ക് നെറ്റ്‌വർക്ക് ഐസൊലേഷൻ വെല്ലുവിളികളെ തരണം ചെയ്യാനും നിങ്ങളുടെ ഡോക്കറൈസ്ഡ് പരിതസ്ഥിതിയിൽ ശക്തമായ കണക്ഷനുകൾ നിലനിർത്താനും കഴിയും.