Koble Nginx i Docker til Localhost MySQL på vertsmaskin

Shell

Tilgang til Localhost Services fra Docker Containers

Å kjøre Nginx inne i en Docker-beholder mens du trenger å koble til en MySQL-instans på vertsmaskinen kan være utfordrende, spesielt når MySQL kun er bundet til localhost. Dette oppsettet forhindrer beholderen i å få direkte tilgang til MySQL-tjenesten ved å bruke standard nettverksmetoder.

Denne artikkelen utforsker ulike løsninger for å bygge bro over dette gapet, og tillater sømløs tilkobling mellom Docker-beholdere og tjenester som kjører på vertens lokale vert. Vi vil diskutere hvorfor vanlige metoder kan komme til kort og gi praktiske trinn for å oppnå ønsket tilkobling.

Kommando Beskrivelse
docker network create --driver bridge hostnetwork Oppretter et tilpasset Docker-nettverk med en brodriver, slik at containere kan kommunisere innenfor samme nettverk.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Trekker ut IP-adressen til vertens docker0-grensesnitt, som brukes til å koble fra containeren til vertstjenestene.
docker exec -it nginx-container bash Utfører et interaktivt bash-skall inne i den kjørende Nginx-beholderen for direkte kommandolinjetilgang.
mysql -h $host_ip -u root -p Kommando som brukes inne i Nginx-beholderen for å koble til MySQL-serveren som kjører på vertsmaskinen ved å bruke den utpakkede IP-adressen.
networks: hostnetwork: external: true Konfigurasjon i Docker Compose for å bruke et eksternt opprettet Docker-nettverk.
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-konfigurasjon til proxy MySQL-forespørsler til vertsmaskinen.
nginx -s reload Laster inn Nginx-tjenesten på nytt for å bruke de nye konfigurasjonsendringene.

Konfigurere Docker og Nginx for å få tilgang til vertstjenester

For å koble en Nginx-beholder til en MySQL-instans som kjører på verten, må vi først etablere en nettverksbro. Kommandoen oppretter dette tilpassede nettverket, og muliggjør kommunikasjon mellom beholdere på samme nettverk. Vi starter deretter MySQL- og Nginx-beholdere på dette nettverket ved hjelp av og , henholdsvis. Dette oppsettet lar beholderne oppdage og kommunisere med hverandre. For å koble til MySQL fra Nginx trenger vi vertens IP-adresse, som kan fås med host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Denne kommandoen fanger opp IP-adressen til docker0-grensesnittet på verten.

Deretter bruker vi for å åpne et interaktivt skall i Nginx-beholderen. Herfra kan vi starte en MySQL-tilkobling ved å bruke , hvor er vertens IP-adresse. Alternativt, bruk av Docker Compose forenkler prosessen ved å definere tjenester og nettverk i en YAML-fil. De networks: hostnetwork: external: true konfigurasjon sikrer at tjenestene bruker et eksternt opprettet nettverk. Til slutt, for å konfigurere Nginx til proxy MySQL-forespørsler, oppdaterer vi konfigurasjonsfilen med og last inn Nginx på nytt ved å bruke . Dette oppsettet lar Nginx videresende forespørsler til MySQL-forekomsten som kjører på verten.

Koble Docker Container til Hosts MySQL via Network Bridge

Shell Script for 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

Bruke Docker Compose for å koble Nginx og Hosts MySQL

Docker Compose YAML-konfigurasjon

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

Konfigurere Nginx for å koble til Host MySQL ved å bruke Docker Network

Nginx-konfigurasjon og Docker Network Command

# 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

Koble Docker-beholdere til vertslokale tjenester

Når du kjører applikasjoner i Docker-beholdere, kan det være utfordrende å få tilgang til tjenester knyttet til vertens lokale vert på grunn av nettverksisolasjon. En effektiv tilnærming er å bruke Dockers vertsnettverksmodus. Ved å starte en beholder med alternativet deler beholderen vertens nettverksstabel, slik at den kan få direkte tilgang til lokalvertsbundne tjenester. Denne modusen er imidlertid mindre bærbar og fungerer kanskje ikke bra i alle miljøer, for eksempel Docker Swarm eller Kubernetes.

En annen tilnærming er å bruke Dockers innebygde DNS-løser, . Dette spesielle DNS-navnet løses til vertens IP-adresse, slik at containere kan kommunisere med tjenester på verten. Denne metoden er enkel og unngår kompleksiteten ved nettverksadministrasjon. Den er imidlertid bare tilgjengelig på Docker for Windows og Mac, ikke på Linux. For Linux-brukere er det en levedyktig løsning å opprette et tilpasset bronettverk og manuelt konfigurere rutingsregler. Dette innebærer å bruke og kommandoer for å rute trafikk fra containernettverket til vertens lokale vertsgrensesnitt.

Vanlige spørsmål om å koble Docker-beholdere til vertstjenester

  1. Hvordan bruker jeg alternativ i Docker?
  2. Kjør beholderen din med for å dele vertens nettverksstabel.
  3. Hva er ?
  4. Det er et spesielt DNS-navn som løses til vertens IP-adresse, tilgjengelig på Docker for Windows og Mac.
  5. Kan jeg bruke på Linux?
  6. Nei, denne funksjonen er ikke tilgjengelig på Docker for Linux.
  7. Hvordan kan jeg opprette et tilpasset bronettverk?
  8. Bruk for å lage et tilpasset bronettverk.
  9. Hva er hensikten med kommando?
  10. Den administrerer nettverkspakkefiltrering og rutingsregler på Linux-systemer.
  11. Hvordan kobler jeg til en MySQL-instans på verten fra en Docker-beholder?
  12. Bruk for Docker på Windows/Mac eller konfigurer ruting for Linux.
  13. Hva er begrensningene ved bruk ?
  14. Det kan redusere portabiliteten og er ikke kompatibelt med enkelte orkestratorer som Kubernetes.
  15. Kan jeg få tilgang til andre tjenester på verten enn MySQL?
  16. Ja, ved å bruke de samme metodene kan du koble til en hvilken som helst tjeneste som kjører på verten.

Siste tanker om tilgang til vertstjenester fra Docker

Å koble til en MySQL-instans på verten fra en Nginx-beholder involverer ulike metoder, hver med sine egne fordeler og begrensninger. Bruk av vertsnettverk, spesielle DNS-navn eller tilpassede nettverksbroer kan effektivt bygge bro over gapet, og sikre jevn kommunikasjon mellom Docker-beholdere og vertstjenester. Ved å forstå og implementere disse strategiene kan du overvinne nettverksisolasjonsutfordringer og opprettholde robuste tilkoblinger i ditt dockeriserte miljø.