Povezivanje Nginxa u Dockeru s Localhost MySQL na glavnom računalu

Povezivanje Nginxa u Dockeru s Localhost MySQL na glavnom računalu
Shell

Pristup Localhost uslugama iz Docker kontejnera

Pokretanje Nginxa unutar Docker spremnika dok se morate povezati s MySQL instancom na glavnom računalu može biti izazovno, osobito kada je MySQL vezan samo na localhost. Ova postavka sprječava spremnik da izravno pristupi MySQL usluzi korištenjem standardnih mrežnih metoda.

Ovaj članak istražuje različita rješenja za premošćivanje ovog jaza, omogućujući besprijekornu povezanost između Docker spremnika i usluga koje se izvode na lokalnom hostu glavnog računala. Razgovarat ćemo o tome zašto uobičajene metode nisu uspješne i ponudit ćemo praktične korake za postizanje željene povezanosti.

Naredba Opis
docker network create --driver bridge hostnetwork Stvara prilagođenu Docker mrežu s upravljačkim programom mosta, dopuštajući spremnicima da komuniciraju unutar iste mreže.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Ekstrahira IP adresu docker0 sučelja glavnog računala, koje se koristi za povezivanje iz spremnika na usluge glavnog računala.
docker exec -it nginx-container bash Izvršava interaktivnu bash ljusku unutar pokrenutog Nginx spremnika za izravan pristup naredbenom retku.
mysql -h $host_ip -u root -p Naredba koja se koristi unutar Nginx spremnika za povezivanje s MySQL poslužiteljem koji radi na glavnom računalu pomoću ekstrahirane IP adrese.
networks: hostnetwork: external: true Konfiguracija u Docker Compose za korištenje eksterno stvorene Docker mreže.
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 Zapisuje novu Nginx konfiguraciju za proxy MySQL zahtjeve glavnom računalu.
nginx -s reload Ponovno učitava uslugu Nginx za primjenu novih promjena konfiguracije.

Konfiguriranje Dockera i Nginxa za pristup uslugama hosta

Za povezivanje Nginx spremnika s MySQL instancom koja radi na hostu, prvo moramo uspostaviti mrežni most. Zapovijed docker network create --driver bridge hostnetwork stvara ovu prilagođenu mrežu, omogućujući komunikaciju između spremnika na istoj mreži. Zatim pokrećemo MySQL i Nginx spremnike na ovoj mreži koristeći docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest i docker run --name nginx-container --network hostnetwork -d nginx:latest, odnosno. Ova postavka omogućuje spremnicima otkrivanje i međusobnu komunikaciju. Za spajanje na MySQL iz Nginx-a potrebna nam je IP adresa hosta koju možemo dobiti pomoću host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Ova naredba hvata IP adresu docker0 sučelja na hostu.

Dalje, koristimo docker exec -it nginx-container bash za otvaranje interaktivne ljuske u Nginx spremniku. Odavde možemo pokrenuti MySQL vezu pomoću mysql -h $host_ip -u root -p, gdje $host_ip je IP adresa glavnog računala. Alternativno, korištenje Docker Compose pojednostavljuje proces definiranjem usluga i mreža u YAML datoteci. The networks: hostnetwork: external: true konfiguracija osigurava da usluge koriste mrežu kreiranu izvana. Konačno, da bismo konfigurirali Nginx za proxy MySQL zahtjeve, ažuriramo njegovu konfiguracijsku datoteku s echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf i ponovno učitajte Nginx pomoću nginx -s reload. Ova postavka omogućuje Nginxu prosljeđivanje zahtjeva MySQL instanci koja se izvodi na hostu.

Povezivanje Docker kontejnera s MySQL-om domaćina putem mrežnog mosta

Shell skripta za postavljanje Docker mreže

# 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

Korištenje Docker Compose za povezivanje Nginxa i MySQL-a domaćina

Docker Compose YAML konfiguracija

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

Konfiguriranje Nginxa za povezivanje s hostom MySQL pomoću Docker mreže

Nginx konfiguracija i Docker mrežna naredba

# 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

Povezivanje Docker kontejnera s lokalnim uslugama domaćina

Prilikom pokretanja aplikacija u Docker spremnicima, pristup uslugama vezanim za lokalni host hosta može biti izazovan zbog mrežne izolacije. Jedan učinkovit pristup je korištenje Dockerovog načina umrežavanja glavnog računala. Pokretanjem spremnika s --network host opcija, spremnik dijeli mrežni stog glavnog računala, dopuštajući mu izravan pristup uslugama vezanim uz lokalni host. Međutim, ovaj je način rada manje prenosiv i možda neće dobro funkcionirati u svim okruženjima, kao što su Docker Swarm ili Kubernetes.

Drugi pristup je korištenje Dockerovog ugrađenog DNS razlučivača, host.docker.internal. Ovo posebno DNS ime rješava IP adresu glavnog računala, omogućujući spremnicima da komuniciraju sa uslugama na glavnom računalu. Ova metoda je jednostavna i izbjegava složenost upravljanja mrežom. Međutim, dostupan je samo na Dockeru za Windows i Mac, ne i na Linuxu. Za korisnike Linuxa, stvaranje prilagođene mreže mosta i ručno konfiguriranje pravila usmjeravanja održivo je rješenje. To uključuje korištenje ip i iptables naredbe za usmjeravanje prometa s mreže spremnika na sučelje hosta localhost.

Uobičajena pitanja o povezivanju Docker kontejnera s uslugama hosta

  1. Kako da koristim --network host opciju u Dockeru?
  2. Pokrenite svoj spremnik s docker run --network host za dijeljenje mrežnog stoga glavnog računala.
  3. Što je host.docker.internal?
  4. To je posebno DNS ime koje se rješava u IP adresu glavnog računala, dostupno na Dockeru za Windows i Mac.
  5. Mogu li koristiti host.docker.internal na Linuxu?
  6. Ne, ova značajka nije dostupna na Dockeru za Linux.
  7. Kako mogu stvoriti prilagođenu mrežu mosta?
  8. Koristiti docker network create --driver bridge my-bridge-network za stvaranje prilagođene mreže mostova.
  9. Koja je svrha iptables naredba?
  10. Upravlja filtriranjem mrežnih paketa i pravilima usmjeravanja na Linux sustavima.
  11. Kako se mogu povezati s MySQL instancom na hostu iz Docker spremnika?
  12. Koristiti mysql -h host.docker.internal -u root -p za Docker na Windows/Mac ili konfigurirajte usmjeravanje za Linux.
  13. Koja su ograničenja korištenja --network host?
  14. Može smanjiti prenosivost i nije kompatibilan s nekim orkestratorima poput Kubernetesa.
  15. Mogu li pristupiti drugim uslugama na hostu osim MySQL-a?
  16. Da, koristeći iste metode, možete se povezati s bilo kojom uslugom koja radi na glavnom računalu.

Završne misli o pristupanju uslugama hosta iz Dockera

Povezivanje s MySQL instancom na glavnom računalu iz Nginx spremnika uključuje različite metode, svaka sa svojim prednostima i ograničenjima. Korištenje umrežavanja hosta, posebnih DNS naziva ili prilagođenih mrežnih mostova može učinkovito premostiti jaz, osiguravajući glatku komunikaciju između Docker spremnika i host usluga. Razumijevanjem i implementacijom ovih strategija možete prevladati izazove mrežne izolacije i održavati robusne veze u svom Dockeriziranom okruženju.