હોસ્ટ મશીન પર ડોકરમાં Nginx ને Localhost MySQL થી કનેક્ટ કરી રહ્યું છે

હોસ્ટ મશીન પર ડોકરમાં Nginx ને Localhost MySQL થી કનેક્ટ કરી રહ્યું છે
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 સેવાને ફરીથી લોડ કરે છે.

હોસ્ટ સેવાઓને ઍક્સેસ કરવા માટે ડોકર અને 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, અનુક્રમે. આ સેટઅપ કન્ટેનરને એકબીજા સાથે શોધવા અને વાતચીત કરવાની મંજૂરી આપે છે. 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 રૂપરેખાંકન ખાતરી કરે છે કે સેવાઓ બાહ્ય રીતે બનાવેલ નેટવર્કનો ઉપયોગ કરે છે. છેલ્લે, 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 દાખલામાં વિનંતીઓ ફોરવર્ડ કરવાની મંજૂરી આપે છે.

નેટવર્ક બ્રિજ દ્વારા ડોકર કન્ટેનરને 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 વિકલ્પ, કન્ટેનર હોસ્ટના નેટવર્ક સ્ટેકને શેર કરે છે, જે તેને લોકલહોસ્ટ-બાઉન્ડ સેવાઓને સીધી ઍક્સેસ કરવાની મંજૂરી આપે છે. જો કે, આ મોડ ઓછું પોર્ટેબલ છે અને ડોકર સ્વોર્મ અથવા કુબરનેટ્સ જેવા તમામ વાતાવરણમાં સારી રીતે કામ કરી શકશે નહીં.

બીજો અભિગમ ડોકરના બિલ્ટ-ઇન DNS રિઝોલ્વરનો ઉપયોગ કરવાનો છે, host.docker.internal. આ વિશિષ્ટ DNS નામ હોસ્ટના IP સરનામાંને ઉકેલે છે, કન્ટેનરને હોસ્ટ પર સેવાઓ સાથે વાતચીત કરવા સક્ષમ બનાવે છે. આ પદ્ધતિ સીધી છે અને નેટવર્ક મેનેજમેન્ટની જટિલતાઓને ટાળે છે. જો કે, તે ફક્ત Windows અને Mac માટે Docker પર ઉપલબ્ધ છે, Linux પર નહીં. Linux વપરાશકર્તાઓ માટે, કસ્ટમ બ્રિજ નેટવર્ક બનાવવું અને રૂટીંગ નિયમોને મેન્યુઅલી ગોઠવવું એ એક સક્ષમ ઉકેલ છે. આનો ઉપયોગ કરવાનો સમાવેશ થાય છે ip અને iptables કન્ટેનર નેટવર્કમાંથી હોસ્ટના લોકલહોસ્ટ ઈન્ટરફેસ પર ટ્રાફિકને રૂટ કરવા માટે આદેશો.

ડોકર કન્ટેનરને હોસ્ટ સેવાઓ સાથે કનેક્ટ કરવા વિશેના સામાન્ય પ્રશ્નો

  1. હું કેવી રીતે ઉપયોગ કરી શકું --network host ડોકરમાં વિકલ્પ?
  2. સાથે તમારા કન્ટેનર ચલાવો docker run --network host હોસ્ટના નેટવર્ક સ્ટેકને શેર કરવા માટે.
  3. શું છે host.docker.internal?
  4. તે એક વિશિષ્ટ DNS નામ છે જે હોસ્ટના IP સરનામાને ઉકેલે છે, જે Windows અને Mac માટે Docker પર ઉપલબ્ધ છે.
  5. શું હું ઉપયોગ કરી શકું છું host.docker.internal Linux પર?
  6. ના, આ સુવિધા Linux માટે Docker પર ઉપલબ્ધ નથી.
  7. હું કસ્ટમ બ્રિજ નેટવર્ક કેવી રીતે બનાવી શકું?
  8. વાપરવુ docker network create --driver bridge my-bridge-network કસ્ટમ બ્રિજ નેટવર્ક બનાવવા માટે.
  9. નો હેતુ શું છે iptables આદેશ?
  10. તે Linux સિસ્ટમ્સ પર નેટવર્ક પેકેટ ફિલ્ટરિંગ અને રૂટીંગ નિયમોનું સંચાલન કરે છે.
  11. હું ડોકર કન્ટેનરમાંથી હોસ્ટ પર MySQL દાખલા સાથે કેવી રીતે કનેક્ટ કરી શકું?
  12. વાપરવુ mysql -h host.docker.internal -u root -p Windows/Mac પર ડોકર માટે અથવા Linux માટે રૂટીંગ ગોઠવો.
  13. ઉપયોગની મર્યાદાઓ શું છે --network host?
  14. તે પોર્ટેબિલિટી ઘટાડી શકે છે અને કુબરનેટ્સ જેવા કેટલાક ઓર્કેસ્ટ્રેટર્સ સાથે સુસંગત નથી.
  15. શું હું MySQL સિવાય હોસ્ટ પર અન્ય સેવાઓનો ઉપયોગ કરી શકું?
  16. હા, સમાન પદ્ધતિઓનો ઉપયોગ કરીને, તમે હોસ્ટ પર ચાલતી કોઈપણ સેવા સાથે કનેક્ટ કરી શકો છો.

ડોકરથી હોસ્ટ સેવાઓને ઍક્સેસ કરવા પર અંતિમ વિચારો

Nginx કન્ટેનરમાંથી હોસ્ટ પર MySQL દાખલા સાથે કનેક્ટ થવામાં વિવિધ પદ્ધતિઓનો સમાવેશ થાય છે, દરેક તેના પોતાના ફાયદા અને મર્યાદાઓ સાથે. હોસ્ટ નેટવર્કિંગનો ઉપયોગ કરીને, વિશેષ DNS નામો અથવા કસ્ટમ નેટવર્ક પુલ અસરકારક રીતે અંતરને દૂર કરી શકે છે, ડોકર કન્ટેનર અને હોસ્ટ સેવાઓ વચ્ચે સરળ સંચાર સુનિશ્ચિત કરી શકે છે. આ વ્યૂહરચનાઓને સમજીને અને અમલમાં મૂકીને, તમે નેટવર્ક આઇસોલેશન પડકારોને દૂર કરી શકો છો અને તમારા ડોકરાઇઝ્ડ વાતાવરણમાં મજબૂત જોડાણ જાળવી શકો છો.