Connessione di Nginx in Docker a Localhost MySQL sulla macchina host

Connessione di Nginx in Docker a Localhost MySQL sulla macchina host
Shell

Accesso ai servizi Localhost dai contenitori Docker

Eseguire Nginx all'interno di un contenitore Docker mentre è necessario connettersi a un'istanza MySQL sul computer host può essere complicato, soprattutto quando MySQL è associato solo a localhost. Questa configurazione impedisce al contenitore di accedere direttamente al servizio MySQL utilizzando metodi di rete standard.

Questo articolo esplora varie soluzioni per colmare questa lacuna, consentendo una connettività senza interruzioni tra i contenitori Docker e i servizi in esecuzione sul localhost dell'host. Discuteremo perché i metodi comuni potrebbero non essere sufficienti e forniremo passaggi pratici per ottenere la connettività desiderata.

Comando Descrizione
docker network create --driver bridge hostnetwork Crea una rete Docker personalizzata con un driver bridge, consentendo ai contenitori di comunicare all'interno della stessa rete.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Estrae l'indirizzo IP dell'interfaccia docker0 dell'host, utilizzata per connettersi dal contenitore ai servizi host.
docker exec -it nginx-container bash Esegue una shell bash interattiva all'interno del contenitore Nginx in esecuzione per l'accesso diretto alla riga di comando.
mysql -h $host_ip -u root -p Comando utilizzato all'interno del contenitore Nginx per connettersi al server MySQL in esecuzione sulla macchina host utilizzando l'indirizzo IP estratto.
networks: hostnetwork: external: true Configurazione in Docker Compose per utilizzare una rete Docker creata esternamente.
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 Scrive una nuova configurazione Nginx per inoltrare le richieste MySQL al computer host.
nginx -s reload Ricarica il servizio Nginx per applicare le nuove modifiche alla configurazione.

Configurazione di Docker e Nginx per accedere ai servizi host

Per connettere un container Nginx a un'istanza MySQL in esecuzione sull'host, dobbiamo prima stabilire un bridge di rete. Il comando docker network create --driver bridge hostnetwork crea questa rete personalizzata, consentendo la comunicazione tra contenitori sulla stessa rete. Avviamo quindi i contenitori MySQL e Nginx su questa rete utilizzando docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest E docker run --name nginx-container --network hostnetwork -d nginx:latest, rispettivamente. Questa configurazione consente ai contenitori di rilevarsi e comunicare tra loro. Per connetterci a MySQL da Nginx, abbiamo bisogno dell'indirizzo IP dell'host, che può essere ottenuto con host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Questo comando acquisisce l'indirizzo IP dell'interfaccia docker0 sull'host.

Successivamente, usiamo docker exec -it nginx-container bash per aprire una shell interattiva nel contenitore Nginx. Da qui, possiamo avviare una connessione MySQL utilizzando mysql -h $host_ip -u root -p, Dove $host_ip è l'indirizzo IP dell'host. In alternativa, l'utilizzo di Docker Compose semplifica il processo definendo servizi e reti in un file YAML. IL networks: hostnetwork: external: true la configurazione garantisce che i servizi utilizzino una rete creata esternamente. Infine, per configurare Nginx per eseguire il proxy delle richieste MySQL, aggiorniamo il suo file di configurazione con echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf e ricaricare Nginx utilizzando nginx -s reload. Questa configurazione consente a Nginx di inoltrare richieste all'istanza MySQL in esecuzione sull'host.

Connessione del contenitore Docker al MySQL dell'host tramite Network Bridge

Script di shell per la configurazione della rete Docker

# 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

Utilizzo di Docker Compose per collegare Nginx e MySQL dell'host

Docker Componi configurazione YAML

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

Configurazione di Nginx per connettersi all'host MySQL utilizzando la rete Docker

Configurazione Nginx e comando di rete Docker

# 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

Connessione dei contenitori Docker ai servizi locali host

Quando si eseguono applicazioni in contenitori Docker, l'accesso ai servizi associati all'host locale dell'host può essere complicato a causa dell'isolamento della rete. Un approccio efficace consiste nell'utilizzare la modalità di rete host di Docker. Avviando un contenitore con il file --network host opzione, il contenitore condivide lo stack di rete dell'host, consentendogli di accedere direttamente ai servizi legati all'host locale. Tuttavia, questa modalità è meno portabile e potrebbe non funzionare bene in tutti gli ambienti, come Docker Swarm o Kubernetes.

Un altro approccio consiste nell'utilizzare il risolutore DNS integrato di Docker, host.docker.internal. Questo nome DNS speciale si risolve nell'indirizzo IP dell'host, consentendo ai contenitori di comunicare con i servizi sull'host. Questo metodo è semplice ed evita le complessità della gestione della rete. Tuttavia, è disponibile solo su Docker per Windows e Mac, non su Linux. Per gli utenti Linux, la creazione di una rete bridge personalizzata e la configurazione manuale delle regole di routing è una soluzione praticabile. Ciò comporta l'utilizzo di ip E iptables comandi per instradare il traffico dalla rete di contenitori all'interfaccia localhost dell'host.

Domande comuni sulla connessione dei contenitori Docker ai servizi host

  1. Come utilizzo il --network host opzione in Docker?
  2. Esegui il tuo contenitore con docker run --network host per condividere lo stack di rete dell'host.
  3. Cosa è host.docker.internal?
  4. È un nome DNS speciale che si risolve nell'indirizzo IP dell'host, disponibile su Docker per Windows e Mac.
  5. Posso usare host.docker.internal su Linux?
  6. No, questa funzionalità non è disponibile su Docker per Linux.
  7. Come posso creare una rete bridge personalizzata?
  8. Utilizzo docker network create --driver bridge my-bridge-network per creare una rete bridge personalizzata.
  9. Qual è lo scopo del iptables comando?
  10. Gestisce il filtraggio dei pacchetti di rete e le regole di routing sui sistemi Linux.
  11. Come mi collego a un'istanza MySQL sull'host da un contenitore Docker?
  12. Utilizzo mysql -h host.docker.internal -u root -p per Docker su Windows/Mac o configurare il routing per Linux.
  13. Quali sono i limiti di utilizzo --network host?
  14. Potrebbe ridurre la portabilità e non è compatibile con alcuni orchestratori come Kubernetes.
  15. Posso accedere ad altri servizi sull'host oltre a MySQL?
  16. Sì, utilizzando gli stessi metodi puoi connetterti a qualsiasi servizio in esecuzione sull'host.

Considerazioni finali sull'accesso ai servizi host da Docker

La connessione a un'istanza MySQL sull'host da un contenitore Nginx prevede vari metodi, ciascuno con i propri vantaggi e limiti. L'utilizzo di reti host, nomi DNS speciali o bridge di rete personalizzati può colmare efficacemente il divario, garantendo una comunicazione fluida tra i contenitori Docker e i servizi host. Comprendendo e implementando queste strategie, puoi superare le sfide dell'isolamento della rete e mantenere connessioni solide nel tuo ambiente dockerizzato.