Connectant Nginx a Docker a Localhost MySQL a la màquina host

Connectant Nginx a Docker a Localhost MySQL a la màquina host
Shell

Accés als serveis Localhost des de Docker Containers

Executar Nginx dins d'un contenidor Docker mentre necessiteu connectar-vos a una instància de MySQL a la màquina amfitrió pot ser un repte, especialment quan MySQL només està vinculat a localhost. Aquesta configuració evita que el contenidor accedeixi directament al servei MySQL mitjançant mètodes de xarxa estàndard.

Aquest article explora diverses solucions per salvar aquesta bretxa, permetent una connectivitat perfecta entre els contenidors Docker i els serveis que s'executen a l'amfitrió local de l'amfitrió. Discutirem per què els mètodes comuns poden quedar curts i proporcionarem passos pràctics per aconseguir la connectivitat desitjada.

Comandament Descripció
docker network create --driver bridge hostnetwork Crea una xarxa Docker personalitzada amb un controlador de pont, que permet que els contenidors es comuniquin dins de la mateixa xarxa.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extreu l'adreça IP de la interfície docker0 de l'amfitrió, que s'utilitza per connectar-se des del contenidor als serveis de l'amfitrió.
docker exec -it nginx-container bash Executa un shell bash interactiu dins del contenidor Nginx en execució per a l'accés directe a la línia d'ordres.
mysql -h $host_ip -u root -p Comanda que s'utilitza dins del contenidor Nginx per connectar-se al servidor MySQL que s'executa a la màquina amfitrió mitjançant l'adreça IP extreta.
networks: hostnetwork: external: true Configuració a Docker Compose per utilitzar una xarxa Docker creada externament.
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 Escriu una nova configuració de Nginx per enviar sol·licituds MySQL a la màquina amfitriona.
nginx -s reload Torna a carregar el servei Nginx per aplicar els nous canvis de configuració.

Configuració de Docker i Nginx per accedir als serveis d'amfitrió

Per connectar un contenidor Nginx a una instància de MySQL que s'executa a l'amfitrió, primer hem d'establir un pont de xarxa. La comanda docker network create --driver bridge hostnetwork crea aquesta xarxa personalitzada, permetent la comunicació entre contenidors de la mateixa xarxa. A continuació, iniciem contenidors MySQL i Nginx en aquesta xarxa utilitzant docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest i docker run --name nginx-container --network hostnetwork -d nginx:latest, respectivament. Aquesta configuració permet que els contenidors es descobreixin i es comuniquin entre ells. Per connectar-nos a MySQL des de Nginx, necessitem l'adreça IP de l'amfitrió, que es pot obtenir amb host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Aquesta ordre captura l'adreça IP de la interfície docker0 a l'amfitrió.

A continuació, fem servir docker exec -it nginx-container bash per obrir un shell interactiu al contenidor Nginx. A partir d'aquí, podem iniciar una connexió MySQL utilitzant mysql -h $host_ip -u root -p, on $host_ip és l'adreça IP de l'amfitrió. Com a alternativa, utilitzar Docker Compose simplifica el procés mitjançant la definició de serveis i xarxes en un fitxer YAML. El networks: hostnetwork: external: true La configuració garanteix que els serveis utilitzen una xarxa creada externament. Finalment, per configurar Nginx per enviar sol·licituds MySQL, actualitzem el seu fitxer de configuració amb echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf i tornar a carregar Nginx utilitzant nginx -s reload. Aquesta configuració permet a Nginx reenviar sol·licituds a la instància de MySQL que s'executa a l'amfitrió.

Connectant Docker Container al MySQL de l'amfitrió mitjançant Network Bridge

Shell Script per a la configuració de la xarxa 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

Utilitzant Docker Compose per enllaçar Nginx i el MySQL de Host

Configuració de Docker Compose 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

Configuració de Nginx per connectar-se a l'amfitrió MySQL mitjançant Docker Network

Configuració de Nginx i comandament de xarxa 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

Connexió de contenidors Docker per allotjar serveis locals

Quan s'executen aplicacions als contenidors Docker, l'accés als serveis vinculats a l'amfitrió local de l'amfitrió pot ser difícil a causa de l'aïllament de la xarxa. Un enfocament eficaç és utilitzar el mode de xarxa d'amfitrió de Docker. En iniciar un contenidor amb el --network host opció, el contenidor comparteix la pila de xarxa de l'amfitrió, cosa que li permet accedir directament als serveis vinculats a localhost. Tanmateix, aquest mode és menys portàtil i pot ser que no funcioni bé en tots els entorns, com ara Docker Swarm o Kubernetes.

Un altre enfocament és utilitzar el solucionador DNS integrat de Docker, host.docker.internal. Aquest nom DNS especial es resol en l'adreça IP de l'amfitrió, la qual cosa permet que els contenidors es comuniquin amb els serveis de l'amfitrió. Aquest mètode és senzill i evita les complexitats de la gestió de la xarxa. Tanmateix, només està disponible a Docker per a Windows i Mac, no a Linux. Per als usuaris de Linux, crear una xarxa de pont personalitzada i configurar manualment les regles d'encaminament és una solució viable. Això implica utilitzar el ip i iptables ordres per encaminar el trànsit des de la xarxa de contenidors a la interfície localhost de l'amfitrió.

Preguntes habituals sobre la connexió de contenidors Docker als serveis d'amfitrió

  1. Com faig servir el --network host opció a Docker?
  2. Executeu el vostre contenidor amb docker run --network host per compartir la pila de xarxa de l'amfitrió.
  3. Què és host.docker.internal?
  4. És un nom DNS especial que es resol amb l'adreça IP de l'amfitrió, disponible a Docker per a Windows i Mac.
  5. Puc utilitzar host.docker.internal a Linux?
  6. No, aquesta funció no està disponible a Docker per a Linux.
  7. Com puc crear una xarxa de pont personalitzada?
  8. Ús docker network create --driver bridge my-bridge-network per crear una xarxa de pont personalitzada.
  9. Quina és la finalitat del iptables comandament?
  10. Gestiona el filtratge de paquets de xarxa i les regles d'encaminament als sistemes Linux.
  11. Com em connecto a una instància de MySQL a l'amfitrió des d'un contenidor Docker?
  12. Ús mysql -h host.docker.internal -u root -p per a Docker a Windows/Mac o configureu l'encaminament per a Linux.
  13. Quines són les limitacions d'ús --network host?
  14. Pot reduir la portabilitat i no és compatible amb alguns orquestradors com Kubernetes.
  15. Puc accedir a altres serveis de l'amfitrió a més de MySQL?
  16. Sí, utilitzant els mateixos mètodes, podeu connectar-vos a qualsevol servei que s'executi a l'amfitrió.

Consideracions finals sobre l'accés als serveis d'amfitrió des de Docker

La connexió a una instància de MySQL a l'amfitrió des d'un contenidor Nginx implica diversos mètodes, cadascun amb els seus propis avantatges i limitacions. L'ús de xarxes d'amfitrió, noms especials de DNS o ponts de xarxa personalitzats poden salvar la bretxa de manera efectiva, garantint una comunicació fluida entre els contenidors Docker i els serveis d'amfitrió. En comprendre i implementar aquestes estratègies, podeu superar els reptes d'aïllament de la xarxa i mantenir connexions sòlides al vostre entorn Dockerized.