Koble Nginx i Docker til Localhost MySQL på vertsmaskin

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 docker network create --driver bridge hostnetwork 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 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. 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 docker exec -it nginx-container bash for å åpne et interaktivt skall i Nginx-beholderen. Herfra kan vi starte en MySQL-tilkobling ved å bruke mysql -h $host_ip -u root -p, hvor $host_ip 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 echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf og last inn Nginx på nytt ved å bruke nginx -s reload. 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 --network host 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, host.docker.internal. 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 ip og 1. 3 kommandoer for å rute trafikk fra containernettverket til vertens lokale vertsgrensesnitt.

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

  1. Hvordan bruker jeg --network host alternativ i Docker?
  2. Kjør beholderen din med docker run --network host for å dele vertens nettverksstabel.
  3. Hva er host.docker.internal?
  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 host.docker.internal på Linux?
  6. Nei, denne funksjonen er ikke tilgjengelig på Docker for Linux.
  7. Hvordan kan jeg opprette et tilpasset bronettverk?
  8. Bruk docker network create --driver bridge my-bridge-network for å lage et tilpasset bronettverk.
  9. Hva er hensikten med 1. 3 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 mysql -h host.docker.internal -u root -p for Docker på Windows/Mac eller konfigurer ruting for Linux.
  13. Hva er begrensningene ved bruk --network host?
  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ø.