Ansluter Nginx i Docker till Localhost MySQL på värdmaskinen

Ansluter Nginx i Docker till Localhost MySQL på värdmaskinen
Shell

Åtkomst till Localhost Services från Docker Containers

Att köra Nginx inuti en Docker-behållare samtidigt som man behöver ansluta till en MySQL-instans på värddatorn kan vara utmanande, speciellt när MySQL endast är bunden till localhost. Denna inställning förhindrar behållaren från att direkt komma åt MySQL-tjänsten med vanliga nätverksmetoder.

Den här artikeln utforskar olika lösningar för att överbrygga detta gap, vilket möjliggör sömlös anslutning mellan Docker-behållare och tjänster som körs på värdens lokala värd. Vi kommer att diskutera varför vanliga metoder kan misslyckas och ger praktiska steg för att uppnå önskad anslutning.

Kommando Beskrivning
docker network create --driver bridge hostnetwork Skapar ett anpassat Docker-nätverk med en bryggdrivrutin, vilket gör att containrar kan kommunicera inom samma nätverk.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extraherar IP-adressen för värdens docker0-gränssnitt, som används för att ansluta från behållaren till värdtjänsterna.
docker exec -it nginx-container bash Kör ett interaktivt bash-skal inuti den körande Nginx-behållaren för direkt kommandoradsåtkomst.
mysql -h $host_ip -u root -p Kommando som används inuti Nginx-behållaren för att ansluta till MySQL-servern som körs på värddatorn med hjälp av den extraherade IP-adressen.
networks: hostnetwork: external: true Konfiguration i Docker Compose för att använda ett externt skapat Docker-nätverk.
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 till proxy MySQL-förfrågningar till värddatorn.
nginx -s reload Laddar om Nginx-tjänsten för att tillämpa de nya konfigurationsändringarna.

Konfigurera Docker och Nginx för åtkomst till värdtjänster

För att ansluta en Nginx-behållare till en MySQL-instans som körs på värden måste vi först upprätta en nätverksbrygga. Kommandot docker network create --driver bridge hostnetwork skapar detta anpassade nätverk, vilket möjliggör kommunikation mellan behållare på samma nätverk. Vi startar sedan MySQL- och Nginx-behållare på detta nätverk med hjälp av docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest och docker run --name nginx-container --network hostnetwork -d nginx:latest, respektive. Denna inställning gör att behållarna kan upptäcka och kommunicera med varandra. För att ansluta till MySQL från Nginx behöver vi värdens IP-adress, som kan erhållas med host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Detta kommando fångar IP-adressen för docker0-gränssnittet på värden.

Därefter använder vi docker exec -it nginx-container bash för att öppna ett interaktivt skal i Nginx-behållaren. Härifrån kan vi initiera en MySQL-anslutning med hjälp av mysql -h $host_ip -u root -p, var $host_ip är värdens IP-adress. Alternativt, att använda Docker Compose förenklar processen genom att definiera tjänster och nätverk i en YAML-fil. De networks: hostnetwork: external: true konfiguration säkerställer att tjänsterna använder ett externt skapat nätverk. Slutligen, för att konfigurera Nginx till proxy MySQL-förfrågningar, uppdaterar vi dess konfigurationsfil med echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf och ladda om Nginx med hjälp av nginx -s reload. Denna inställning tillåter Nginx att vidarebefordra förfrågningar till MySQL-instansen som körs på värden.

Ansluter Docker Container till Hosts MySQL via Network Bridge

Shell Script för 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

Använda Docker Compose för att länka Nginx och Hosts 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

Konfigurera Nginx för att ansluta till Host MySQL med hjälp av Docker Network

Nginx Configuration och 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

Ansluta Docker-containrar till värdlokala tjänster

När du kör applikationer i Docker-behållare kan åtkomst till tjänster bundna till värdens lokala värd vara utmanande på grund av nätverksisolering. Ett effektivt tillvägagångssätt är att använda Dockers värdnätverksläge. Genom att starta en container med --network host alternativet delar behållaren värdens nätverksstack, vilket gör att den kan komma åt lokala värdbundna tjänster direkt. Det här läget är dock mindre portabelt och kanske inte fungerar bra i alla miljöer, som Docker Swarm eller Kubernetes.

Ett annat tillvägagångssätt är att använda Dockers inbyggda DNS-resolver, host.docker.internal. Detta speciella DNS-namn löser sig till värdens IP-adress, vilket gör att behållare kan kommunicera med tjänster på värden. Denna metod är enkel och undviker komplexiteten med nätverkshantering. Det är dock bara tillgängligt på Docker för Windows och Mac, inte på Linux. För Linux-användare är det en gångbar lösning att skapa ett anpassat bryggnätverk och manuellt konfigurera routingregler. Detta innebär att använda ip och iptables kommandon för att dirigera trafik från containernätverket till värdens lokala värdgränssnitt.

Vanliga frågor om att ansluta Docker-containrar till värdtjänster

  1. Hur använder jag --network host alternativ i Docker?
  2. Kör din container med docker run --network host för att dela värdens nätverksstack.
  3. Vad är host.docker.internal?
  4. Det är ett speciellt DNS-namn som löser sig till värdens IP-adress, tillgängligt på Docker för Windows och Mac.
  5. Kan jag använda host.docker.internal på Linux?
  6. Nej, den här funktionen är inte tillgänglig på Docker för Linux.
  7. Hur skapar jag ett anpassat bryggnätverk?
  8. Använda sig av docker network create --driver bridge my-bridge-network för att skapa ett anpassat bryggnätverk.
  9. Vad är syftet med iptables kommando?
  10. Den hanterar nätverkspaketfiltrering och routingregler på Linux-system.
  11. Hur ansluter jag till en MySQL-instans på värden från en Docker-behållare?
  12. Använda sig av mysql -h host.docker.internal -u root -p för Docker på Windows/Mac eller konfigurera routing för Linux.
  13. Vilka är begränsningarna för att använda --network host?
  14. Det kan minska portabiliteten och är inte kompatibelt med vissa orkestratorer som Kubernetes.
  15. Kan jag komma åt andra tjänster på värden förutom MySQL?
  16. Ja, med samma metoder kan du ansluta till vilken tjänst som helst som körs på värden.

Slutliga tankar om åtkomst till värdtjänster från Docker

Att ansluta till en MySQL-instans på värden från en Nginx-behållare involverar olika metoder, var och en med sina egna fördelar och begränsningar. Att använda värdnätverk, speciella DNS-namn eller anpassade nätverksbryggor kan effektivt överbrygga klyftan, vilket säkerställer smidig kommunikation mellan Docker-behållare och värdtjänster. Genom att förstå och implementera dessa strategier kan du övervinna utmaningar med nätverksisolering och upprätthålla robusta anslutningar i din Dockeriserade miljö.