Tilslutning af Nginx i Docker til Localhost MySQL på værtsmaskine

Tilslutning af Nginx i Docker til Localhost MySQL på værtsmaskine
Shell

Adgang til Localhost Services fra Docker Containers

At køre Nginx inde i en Docker-container, mens du skal oprette forbindelse til en MySQL-instans på værtsmaskinen, kan være udfordrende, især når MySQL kun er bundet til localhost. Denne opsætning forhindrer containeren i at få direkte adgang til MySQL-tjenesten ved hjælp af standardnetværksmetoder.

Denne artikel udforsker forskellige løsninger til at bygge bro over dette hul, hvilket muliggør problemfri forbindelse mellem Docker-containere og tjenester, der kører på værtens lokale vært. Vi vil diskutere, hvorfor almindelige metoder kan komme til kort, og give praktiske trin til at opnå den ønskede forbindelse.

Kommando Beskrivelse
docker network create --driver bridge hostnetwork Opretter et brugerdefineret Docker-netværk med en brodriver, der tillader containere at kommunikere inden for det samme netværk.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Uddrager IP-adressen på værtens docker0-grænseflade, som bruges til at oprette forbindelse fra containeren til værtstjenesterne.
docker exec -it nginx-container bash Udfører en interaktiv bash-shell inde i den kørende Nginx-beholder for direkte kommandolinjeadgang.
mysql -h $host_ip -u root -p Kommando, der bruges inde i Nginx-beholderen til at oprette forbindelse til MySQL-serveren, der kører på værtsmaskinen, ved hjælp af den udpakkede IP-adresse.
networks: hostnetwork: external: true Konfiguration i Docker Compose for at bruge et eksternt oprettet Docker-netværk.
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 Skriver en ny Nginx-konfiguration til proxy MySQL-anmodninger til værtsmaskinen.
nginx -s reload Genindlæser Nginx-tjenesten for at anvende de nye konfigurationsændringer.

Konfiguration af Docker og Nginx for at få adgang til værtstjenester

For at forbinde en Nginx-container til en MySQL-instans, der kører på værten, skal vi først etablere en netværksbro. Kommandoen docker network create --driver bridge hostnetwork opretter dette brugerdefinerede netværk, hvilket muliggør kommunikation mellem containere på det samme netværk. Vi starter derefter MySQL- og Nginx-containere på dette netværk ved hjælp af docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest og docker run --name nginx-container --network hostnetwork -d nginx:latest, henholdsvis. Denne opsætning gør det muligt for containerne at opdage og kommunikere med hinanden. For at oprette forbindelse til MySQL fra Nginx skal vi bruge værtens IP-adresse, som kan fås med host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Denne kommando fanger IP-adressen på docker0-grænsefladen på værten.

Dernæst bruger vi docker exec -it nginx-container bash for at åbne en interaktiv skal i Nginx-beholderen. Herfra kan vi starte en MySQL-forbindelse vha mysql -h $host_ip -u root -p, hvor $host_ip er værtens IP-adresse. Alternativt forenkler brugen af ​​Docker Compose processen ved at definere tjenester og netværk i en YAML-fil. Det networks: hostnetwork: external: true konfiguration sikrer, at tjenesterne bruger et eksternt oprettet netværk. Endelig, for at konfigurere Nginx til proxy MySQL-anmodninger, opdaterer vi dens konfigurationsfil med echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf og genindlæs Nginx vha nginx -s reload. Denne opsætning tillader Nginx at videresende anmodninger til den MySQL-instans, der kører på værten.

Tilslutning af Docker Container til Hosts MySQL via Network Bridge

Shell Script til Docker Network Setup

# 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

Brug af Docker Compose til at forbinde Nginx og værtens MySQL

Docker Compose YAML-konfiguration

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

Konfiguration af Nginx til at oprette forbindelse til Host MySQL ved hjælp af Docker Network

Nginx-konfiguration og Docker-netværkskommando

# 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

Tilslutning af docker-containere til værtslokale tjenester

Når du kører applikationer i Docker-containere, kan det være en udfordring at få adgang til tjenester, der er bundet til værtens lokale vært, på grund af netværksisolation. En effektiv tilgang er at bruge Dockers værtsnetværkstilstand. Ved at starte en container med --network host mulighed, deler containeren værtens netværksstak, hvilket giver den mulighed for at få direkte adgang til localhost-bundne tjenester. Denne tilstand er dog mindre bærbar og fungerer muligvis ikke godt i alle miljøer, såsom Docker Swarm eller Kubernetes.

En anden tilgang er at bruge Dockers indbyggede DNS-resolver, host.docker.internal. Dette specielle DNS-navn omdannes til værtens IP-adresse, hvilket gør det muligt for containere at kommunikere med tjenester på værten. Denne metode er ligetil og undgår kompleksiteten ved netværksstyring. Det er dog kun tilgængeligt på Docker til Windows og Mac, ikke på Linux. For Linux-brugere er oprettelse af et brugerdefineret bridge-netværk og manuel konfiguration af routingregler en levedygtig løsning. Dette indebærer brug af ip og iptables kommandoer til at dirigere trafik fra containernetværket til værtens lokale værtsgrænseflade.

Almindelige spørgsmål om tilslutning af Docker-containere til værtstjenester

  1. Hvordan bruger jeg --network host mulighed i Docker?
  2. Kør din container med docker run --network host for at dele værtens netværksstak.
  3. Hvad er host.docker.internal?
  4. Det er et specielt DNS-navn, der omdannes til værtens IP-adresse, tilgængeligt på Docker til Windows og Mac.
  5. Kan jeg bruge host.docker.internal på Linux?
  6. Nej, denne funktion er ikke tilgængelig på Docker til Linux.
  7. Hvordan kan jeg oprette et brugerdefineret bridge-netværk?
  8. Brug docker network create --driver bridge my-bridge-network at oprette et brugerdefineret bro-netværk.
  9. Hvad er formålet med iptables kommando?
  10. Det administrerer netværkspakkefiltrering og routingregler på Linux-systemer.
  11. Hvordan opretter jeg forbindelse til en MySQL-instans på værten fra en Docker-container?
  12. Brug mysql -h host.docker.internal -u root -p til Docker på Windows/Mac eller konfigurer routing til Linux.
  13. Hvad er begrænsningerne ved at bruge --network host?
  14. Det kan reducere portabiliteten og er ikke kompatibelt med nogle orkestratorer som Kubernetes.
  15. Kan jeg få adgang til andre tjenester på værten end MySQL?
  16. Ja, ved at bruge de samme metoder kan du oprette forbindelse til enhver tjeneste, der kører på værten.

Endelige tanker om adgang til værtstjenester fra Docker

Tilslutning til en MySQL-instans på værten fra en Nginx-beholder involverer forskellige metoder, hver med sine egne fordele og begrænsninger. Brug af værtsnetværk, specielle DNS-navne eller brugerdefinerede netværksbroer kan effektivt bygge bro over kløften, hvilket sikrer jævn kommunikation mellem Docker-containere og værtstjenester. Ved at forstå og implementere disse strategier kan du overvinde udfordringer med netværksisolering og opretholde robuste forbindelser i dit Dockerized-miljø.