Connexion de Nginx dans Docker à Localhost MySQL sur la machine hôte

Connexion de Nginx dans Docker à Localhost MySQL sur la machine hôte
Shell

Accéder aux services Localhost à partir de conteneurs Docker

Exécuter Nginx dans un conteneur Docker tout en devant se connecter à une instance MySQL sur la machine hôte peut s'avérer difficile, en particulier lorsque MySQL est lié uniquement à localhost. Cette configuration empêche le conteneur d'accéder directement au service MySQL à l'aide de méthodes réseau standard.

Cet article explore diverses solutions pour combler cette lacune, permettant une connectivité transparente entre les conteneurs Docker et les services exécutés sur l'hôte local de l'hôte. Nous expliquerons pourquoi les méthodes courantes peuvent échouer et fournirons des étapes pratiques pour obtenir la connectivité souhaitée.

Commande Description
docker network create --driver bridge hostnetwork Crée un réseau Docker personnalisé avec un pilote de pont, permettant aux conteneurs de communiquer au sein du même réseau.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extrait l'adresse IP de l'interface docker0 de l'hôte, qui est utilisée pour se connecter du conteneur aux services hôtes.
docker exec -it nginx-container bash Exécute un shell bash interactif dans le conteneur Nginx en cours d'exécution pour un accès direct en ligne de commande.
mysql -h $host_ip -u root -p Commande utilisée dans le conteneur Nginx pour se connecter au serveur MySQL exécuté sur la machine hôte à l'aide de l'adresse IP extraite.
networks: hostnetwork: external: true Configuration dans Docker Compose pour utiliser un réseau Docker créé en externe.
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 Écrit une nouvelle configuration Nginx pour envoyer par proxy les requêtes MySQL à la machine hôte.
nginx -s reload Recharge le service Nginx pour appliquer les nouvelles modifications de configuration.

Configuration de Docker et Nginx pour accéder aux services hôte

Pour connecter un conteneur Nginx à une instance MySQL exécutée sur l'hôte, nous devons d'abord établir un pont réseau. La commande docker network create --driver bridge hostnetwork crée ce réseau personnalisé, permettant la communication entre les conteneurs sur le même réseau. Nous démarrons ensuite les conteneurs MySQL et Nginx sur ce réseau en utilisant docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest et docker run --name nginx-container --network hostnetwork -d nginx:latest, respectivement. Cette configuration permet aux conteneurs de se découvrir et de communiquer entre eux. Pour nous connecter à MySQL depuis Nginx, nous avons besoin de l'adresse IP de l'hôte, qui peut être obtenue avec host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Cette commande capture l'adresse IP de l'interface docker0 sur l'hôte.

Ensuite, nous utilisons docker exec -it nginx-container bash pour ouvrir un shell interactif dans le conteneur Nginx. De là, nous pouvons initier une connexion MySQL en utilisant mysql -h $host_ip -u root -p, où $host_ip est l'adresse IP de l'hôte. Alternativement, l'utilisation de Docker Compose simplifie le processus en définissant les services et les réseaux dans un fichier YAML. Le networks: hostnetwork: external: true La configuration garantit que les services utilisent un réseau créé en externe. Enfin, pour configurer Nginx pour proxy les requêtes MySQL, nous mettons à jour son fichier de configuration avec echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf et rechargez Nginx en utilisant nginx -s reload. Cette configuration permet à Nginx de transmettre les requêtes à l'instance MySQL exécutée sur l'hôte.

Connexion du conteneur Docker au MySQL de l'hôte via un pont réseau

Script Shell pour la configuration du réseau 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

Utiliser Docker Compose pour lier Nginx et MySQL de l'hôte

Configuration YAML de Docker Compose

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

Configuration de Nginx pour se connecter à l'hôte MySQL à l'aide du réseau Docker

Configuration Nginx et commande réseau 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

Connexion de conteneurs Docker aux services locaux hébergés

Lors de l'exécution d'applications dans des conteneurs Docker, l'accès aux services liés à l'hôte local de l'hôte peut être difficile en raison de l'isolation du réseau. Une approche efficace consiste à utiliser le mode réseau hôte de Docker. En démarrant un conteneur avec le dix option, le conteneur partage la pile réseau de l'hôte, lui permettant d'accéder directement aux services liés à l'hôte local. Cependant, ce mode est moins portable et peut ne pas fonctionner correctement dans tous les environnements, comme Docker Swarm ou Kubernetes.

Une autre approche consiste à utiliser le résolveur DNS intégré de Docker, host.docker.internal. Ce nom DNS spécial correspond à l'adresse IP de l'hôte, permettant aux conteneurs de communiquer avec les services sur l'hôte. Cette méthode est simple et évite les complexités de la gestion du réseau. Cependant, il n'est disponible que sur Docker pour Windows et Mac, pas sur Linux. Pour les utilisateurs Linux, la création d'un réseau de pont personnalisé et la configuration manuelle des règles de routage constituent une solution viable. Cela implique d'utiliser le ip et iptables commandes pour acheminer le trafic du réseau de conteneurs vers l'interface localhost de l'hôte.

Questions courantes sur la connexion des conteneurs Docker aux services hôtes

  1. Comment puis-je utiliser le dix option dans Docker ?
  2. Exécutez votre conteneur avec docker run --network host pour partager la pile réseau de l'hôte.
  3. Qu'est-ce que host.docker.internal?
  4. Il s'agit d'un nom DNS spécial qui correspond à l'adresse IP de l'hôte, disponible sur Docker pour Windows et Mac.
  5. Puis-je utiliser host.docker.internal sous Linux ?
  6. Non, cette fonctionnalité n'est pas disponible sur Docker pour Linux.
  7. Comment puis-je créer un réseau de pont personnalisé ?
  8. Utiliser docker network create --driver bridge my-bridge-network pour créer un réseau de pont personnalisé.
  9. Quel est le but du iptables commande?
  10. Il gère le filtrage des paquets réseau et les règles de routage sur les systèmes Linux.
  11. Comment puis-je me connecter à une instance MySQL sur l'hôte à partir d'un conteneur Docker ?
  12. Utiliser mysql -h host.docker.internal -u root -p pour Docker sur Windows/Mac ou configurez le routage pour Linux.
  13. Quelles sont les limites d'utilisation dix?
  14. Cela peut réduire la portabilité et n'est pas compatible avec certains orchestrateurs comme Kubernetes.
  15. Puis-je accéder à d’autres services sur l’hôte en plus de MySQL ?
  16. Oui, en utilisant les mêmes méthodes, vous pouvez vous connecter à n’importe quel service exécuté sur l’hôte.

Réflexions finales sur l'accès aux services hôte à partir de Docker

La connexion à une instance MySQL sur l'hôte à partir d'un conteneur Nginx implique différentes méthodes, chacune avec ses propres avantages et limites. L'utilisation d'un réseau hôte, de noms DNS spéciaux ou de ponts réseau personnalisés peut combler efficacement le fossé, garantissant une communication fluide entre les conteneurs Docker et les services hôtes. En comprenant et en mettant en œuvre ces stratégies, vous pouvez surmonter les défis d'isolation du réseau et maintenir des connexions robustes dans votre environnement Dockerisé.