Conectarea Nginx în Docker la Localhost MySQL pe mașina gazdă

Conectarea Nginx în Docker la Localhost MySQL pe mașina gazdă
Shell

Accesarea Serviciilor Localhost din Docker Containers

Rularea Nginx în interiorul unui container Docker în timp ce trebuie să vă conectați la o instanță MySQL pe mașina gazdă poate fi o provocare, mai ales când MySQL este legat doar la localhost. Această configurare împiedică containerul să acceseze direct serviciul MySQL folosind metode standard de rețea.

Acest articol explorează diverse soluții pentru a reduce acest decalaj, permițând conectivitate fără întreruperi între containerele Docker și serviciile care rulează pe gazda locală a gazdei. Vom discuta de ce metodele comune pot fi insuficiente și vom oferi pași practici pentru a obține conectivitatea dorită.

Comanda Descriere
docker network create --driver bridge hostnetwork Creează o rețea Docker personalizată cu un driver bridge, permițând containerelor să comunice în cadrul aceleiași rețele.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extrage adresa IP a interfeței docker0 a gazdei, care este utilizată pentru a se conecta de la container la serviciile gazdă.
docker exec -it nginx-container bash Executează un shell bash interactiv în interiorul containerului Nginx care rulează pentru acces direct la linia de comandă.
mysql -h $host_ip -u root -p Comanda utilizată în interiorul containerului Nginx pentru a se conecta la serverul MySQL care rulează pe mașina gazdă folosind adresa IP extrasă.
networks: hostnetwork: external: true Configurare în Docker Compose pentru a utiliza o rețea Docker creată extern.
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 Scrie o nouă configurație Nginx pentru a trimite cererile MySQL către mașina gazdă.
nginx -s reload Reîncarcă serviciul Nginx pentru a aplica noile modificări de configurare.

Configurarea Docker și Nginx pentru a accesa serviciile gazdă

Pentru a conecta un container Nginx la o instanță MySQL care rulează pe gazdă, trebuie mai întâi să stabilim o punte de rețea. Comanda docker network create --driver bridge hostnetwork creează această rețea personalizată, permițând comunicarea între containerele din aceeași rețea. Apoi pornim containerele MySQL și Nginx în această rețea folosind 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, respectiv. Această configurație permite containerelor să descopere și să comunice între ele. Pentru a vă conecta la MySQL de la Nginx, avem nevoie de adresa IP a gazdei, care poate fi obținută cu host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Această comandă captează adresa IP a interfeței docker0 de pe gazdă.

În continuare, folosim docker exec -it nginx-container bash pentru a deschide un shell interactiv în containerul Nginx. De aici, putem iniția o conexiune MySQL folosind mysql -h $host_ip -u root -p, Unde $host_ip este adresa IP a gazdei. Alternativ, utilizarea Docker Compose simplifică procesul prin definirea serviciilor și rețelelor într-un fișier YAML. The networks: hostnetwork: external: true configurația asigură că serviciile utilizează o rețea creată extern. În cele din urmă, pentru a configura Nginx să proxy solicitările MySQL, actualizăm fișierul de configurare cu echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf și reîncărcați Nginx folosind nginx -s reload. Această configurare permite Nginx să trimită cereri către instanța MySQL care rulează pe gazdă.

Conectarea Docker Container la Host MySQL prin Network Bridge

Script Shell pentru configurarea rețelei 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

Folosind Docker Compose pentru a conecta Nginx și MySQL-ul Host

Configurație YAML Docker Compose

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

Configurarea Nginx pentru a se conecta la gazdă MySQL utilizând rețeaua Docker

Configurarea Nginx și comanda rețelei 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

Conectarea containerelor Docker la gazdă servicii locale

Când rulați aplicații în containere Docker, accesarea serviciilor legate de gazda locală a gazdei poate fi dificilă din cauza izolării rețelei. O abordare eficientă este utilizarea modului de rețea gazdă al Docker. Prin pornirea unui container cu --network host opțiunea, containerul partajează stiva de rețea a gazdei, permițându-i să acceseze direct serviciile legate de localhost. Cu toate acestea, acest mod este mai puțin portabil și poate să nu funcționeze bine în toate mediile, cum ar fi Docker Swarm sau Kubernetes.

O altă abordare este utilizarea soluției DNS încorporate de la Docker, host.docker.internal. Acest nume DNS special se rezolvă la adresa IP a gazdei, permițând containerelor să comunice cu serviciile de pe gazdă. Această metodă este simplă și evită complexitatea gestionării rețelei. Cu toate acestea, este disponibil numai pe Docker pentru Windows și Mac, nu și pe Linux. Pentru utilizatorii Linux, crearea unei rețele de punte personalizată și configurarea manuală a regulilor de rutare este o soluție viabilă. Aceasta implică utilizarea ip și iptables comenzi pentru a direcționa traficul din rețeaua de containere către interfața localhost a gazdei.

Întrebări frecvente despre conectarea containerelor Docker la serviciile gazdă

  1. Cum folosesc --network host opțiune în Docker?
  2. Rulați containerul cu docker run --network host pentru a partaja stiva de rețea a gazdei.
  3. Ce este host.docker.internal?
  4. Este un nume DNS special care se rezolvă la adresa IP a gazdei, disponibilă pe Docker pentru Windows și Mac.
  5. Pot folosi host.docker.internal pe Linux?
  6. Nu, această funcție nu este disponibilă pe Docker pentru Linux.
  7. Cum pot crea o rețea de punte personalizată?
  8. Utilizare docker network create --driver bridge my-bridge-network pentru a crea o rețea de poduri personalizată.
  9. Care este scopul iptables comanda?
  10. Gestionează regulile de filtrare și rutare a pachetelor de rețea pe sistemele Linux.
  11. Cum mă conectez la o instanță MySQL pe gazdă dintr-un container Docker?
  12. Utilizare mysql -h host.docker.internal -u root -p pentru Docker pe Windows/Mac sau configurați rutarea pentru Linux.
  13. Care sunt limitările utilizării --network host?
  14. Poate reduce portabilitatea și nu este compatibil cu unii orchestratori precum Kubernetes.
  15. Pot accesa alte servicii pe gazdă în afară de MySQL?
  16. Da, folosind aceleași metode, vă puteți conecta la orice serviciu care rulează pe gazdă.

Gânduri finale despre accesarea serviciilor gazdă din Docker

Conectarea la o instanță MySQL pe gazdă dintr-un container Nginx implică diverse metode, fiecare cu propriile beneficii și limitări. Folosirea rețelelor gazdă, a numelor DNS speciale sau a punților de rețea personalizate poate reduce în mod eficient decalajul, asigurând o comunicare lină între containerele Docker și serviciile gazdă. Înțelegând și implementând aceste strategii, puteți depăși provocările de izolare a rețelei și puteți menține conexiuni solide în mediul dvs. Dockerizat.