Nginx in Docker verbinden met Localhost MySQL op hostmachine

Nginx in Docker verbinden met Localhost MySQL op hostmachine
Shell

Toegang tot Localhost Services vanuit Docker Containers

Het uitvoeren van Nginx in een Docker-container terwijl verbinding moet worden gemaakt met een MySQL-instantie op de hostmachine kan een uitdaging zijn, vooral wanneer MySQL alleen aan localhost is gebonden. Deze opstelling voorkomt dat de container rechtstreeks toegang krijgt tot de MySQL-service met behulp van standaard netwerkmethoden.

In dit artikel worden verschillende oplossingen onderzocht om deze kloof te overbruggen, waardoor naadloze connectiviteit mogelijk wordt tussen Docker-containers en services die op de localhost van de host draaien. We bespreken waarom gangbare methoden tekortschieten en bieden praktische stappen om de gewenste connectiviteit te bereiken.

Commando Beschrijving
docker network create --driver bridge hostnetwork Creëert een aangepast Docker-netwerk met een bridge-driver, waardoor containers binnen hetzelfde netwerk kunnen communiceren.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extraheert het IP-adres van de docker0-interface van de host, die wordt gebruikt om verbinding te maken vanuit de container met de hostservices.
docker exec -it nginx-container bash Voert een interactieve bash-shell uit in de actieve Nginx-container voor directe toegang via de opdrachtregel.
mysql -h $host_ip -u root -p Commando gebruikt in de Nginx-container om verbinding te maken met de MySQL-server die op de hostmachine draait met behulp van het geëxtraheerde IP-adres.
networks: hostnetwork: external: true Configuratie in Docker Compose om een ​​extern aangemaakt Docker-netwerk te gebruiken.
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 Schrijft een nieuwe Nginx-configuratie om MySQL-verzoeken naar de hostmachine te proxyeren.
nginx -s reload Laadt de Nginx-service opnieuw om de nieuwe configuratiewijzigingen toe te passen.

Docker en Nginx configureren voor toegang tot hostservices

Om een ​​Nginx-container te verbinden met een MySQL-instantie die op de host draait, moeten we eerst een netwerkbrug tot stand brengen. Het bevel docker network create --driver bridge hostnetwork creëert dit aangepaste netwerk, waardoor communicatie tussen containers op hetzelfde netwerk mogelijk wordt. Vervolgens starten we MySQL- en Nginx-containers op dit netwerk met behulp van docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest En docker run --name nginx-container --network hostnetwork -d nginx:latestrespectievelijk. Door deze opstelling kunnen de containers elkaar ontdekken en met elkaar communiceren. Om verbinding te maken met MySQL vanuit Nginx hebben we het IP-adres van de host nodig, waarmee we kunnen verkrijgen host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Met deze opdracht wordt het IP-adres van de docker0-interface op de host vastgelegd.

Vervolgens gebruiken we docker exec -it nginx-container bash om een ​​interactieve shell in de Nginx-container te openen. Vanaf hier kunnen we een MySQL-verbinding tot stand brengen met behulp van mysql -h $host_ip -u root -p, waar $host_ip is het IP-adres van de host. Als alternatief vereenvoudigt het gebruik van Docker Compose het proces door services en netwerken in een YAML-bestand te definiëren. De networks: hostnetwork: external: true configuratie zorgt ervoor dat de services een extern gecreëerd netwerk gebruiken. Om Nginx te configureren voor proxy-MySQL-verzoeken, werken we ten slotte het configuratiebestand bij met echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf en herlaad Nginx met behulp van nginx -s reload. Met deze configuratie kan Nginx verzoeken doorsturen naar de MySQL-instantie die op de host draait.

Docker Container verbinden met MySQL van de host via Network Bridge

Shell-script voor Docker-netwerkinstallatie

# 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

Docker Compose gebruiken om Nginx en MySQL van Host te koppelen

Docker Stel YAML-configuratie samen

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

Nginx configureren om verbinding te maken met Host MySQL via Docker Network

Nginx-configuratie en Docker-netwerkopdracht

# 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

Docker-containers verbinden met het hosten van lokale services

Bij het uitvoeren van applicaties in Docker-containers kan het lastig zijn om toegang te krijgen tot services die zijn gebonden aan de localhost van de host vanwege netwerkisolatie. Een effectieve aanpak is om de hostnetwerkmodus van Docker te gebruiken. Door een container te starten met de --network host optie deelt de container de netwerkstack van de host, waardoor deze rechtstreeks toegang heeft tot localhost-gebonden services. Deze modus is echter minder draagbaar en werkt mogelijk niet goed in alle omgevingen, zoals Docker Swarm of Kubernetes.

Een andere aanpak is om de ingebouwde DNS-resolver van Docker te gebruiken, host.docker.internal. Deze speciale DNS-naam wordt omgezet in het IP-adres van de host, waardoor containers kunnen communiceren met services op de host. Deze methode is eenvoudig en vermijdt de complexiteit van netwerkbeheer. Het is echter alleen beschikbaar op Docker voor Windows en Mac, niet op Linux. Voor Linux-gebruikers is het creëren van een aangepast bridge-netwerk en het handmatig configureren van routeringsregels een haalbare oplossing. Hierbij wordt gebruik gemaakt van de ip En iptables opdrachten om verkeer van het containernetwerk naar de localhost-interface van de host te routeren.

Veelgestelde vragen over het verbinden van Docker-containers met hostservices

  1. Hoe gebruik ik de --network host optie in Docker?
  2. Voer uw container uit met docker run --network host om de netwerkstack van de host te delen.
  3. Wat is host.docker.internal?
  4. Het is een speciale DNS-naam die wordt omgezet in het IP-adres van de host, beschikbaar in Docker voor Windows en Mac.
  5. Kan ik gebruiken host.docker.internal op Linux?
  6. Nee, deze functie is niet beschikbaar in Docker voor Linux.
  7. Hoe kan ik een aangepast bridgenetwerk maken?
  8. Gebruik docker network create --driver bridge my-bridge-network om een ​​aangepast brugnetwerk te creëren.
  9. Wat is het doel van de iptables commando?
  10. Het beheert netwerkpakketfiltering en routeringsregels op Linux-systemen.
  11. Hoe maak ik verbinding met een MySQL-instantie op de host vanuit een Docker-container?
  12. Gebruik mysql -h host.docker.internal -u root -p voor Docker op Windows/Mac of configureer routing voor Linux.
  13. Wat zijn de beperkingen van het gebruik --network host?
  14. Het kan de draagbaarheid verminderen en is niet compatibel met sommige orkestrators zoals Kubernetes.
  15. Heb ik naast MySQL toegang tot andere services op de host?
  16. Ja, met dezelfde methoden kunt u verbinding maken met elke service die op de host draait.

Laatste gedachten over toegang tot hostservices vanuit Docker

Verbinding maken met een MySQL-instantie op de host vanuit een Nginx-container omvat verschillende methoden, elk met zijn eigen voordelen en beperkingen. Het gebruik van hostnetwerken, speciale DNS-namen of aangepaste netwerkbruggen kan de kloof effectief overbruggen, waardoor een soepele communicatie tussen Docker-containers en hostservices wordt gegarandeerd. Door deze strategieën te begrijpen en te implementeren, kunt u uitdagingen op het gebied van netwerkisolatie overwinnen en robuuste verbindingen in uw Dockerized-omgeving behouden.