Pripojenie Nginx v Docker k Localhost MySQL na hostiteľskom počítači

Pripojenie Nginx v Docker k Localhost MySQL na hostiteľskom počítači
Shell

Prístup k službám Localhost z kontajnerov Docker

Spustenie Nginx v kontajneri Docker pri potrebe pripojenia k inštancii MySQL na hostiteľskom počítači môže byť náročné, najmä ak je MySQL viazaný iba na localhost. Toto nastavenie zabraňuje kontajneru v priamom prístupe k službe MySQL pomocou štandardných sieťových metód.

Tento článok skúma rôzne riešenia na preklenutie tejto medzery, čo umožňuje bezproblémové pripojenie medzi kontajnermi Docker a službami bežiacimi na lokálnom hostiteľovi hostiteľa. Budeme diskutovať o tom, prečo môžu bežné metódy zaostávať, a poskytneme praktické kroky na dosiahnutie požadovanej konektivity.

Príkaz Popis
docker network create --driver bridge hostnetwork Vytvára vlastnú sieť Docker s ovládačom mosta, čo umožňuje kontajnerom komunikovať v rámci rovnakej siete.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extrahuje IP adresu hostiteľského rozhrania docker0, ktoré sa používa na pripojenie z kontajnera k hostiteľským službám.
docker exec -it nginx-container bash Spustí interaktívny bash shell vo vnútri spusteného kontajnera Nginx pre priamy prístup z príkazového riadku.
mysql -h $host_ip -u root -p Príkaz používaný vo vnútri kontajnera Nginx na pripojenie k serveru MySQL bežiacemu na hostiteľskom počítači pomocou extrahovanej adresy IP.
networks: hostnetwork: external: true Konfigurácia v Docker Compose na použitie externe vytvorenej siete Docker.
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 Zapíše novú konfiguráciu Nginx na proxy požiadavky MySQL na hostiteľský počítač.
nginx -s reload Znova načíta službu Nginx, aby sa použili nové konfiguračné zmeny.

Konfigurácia Docker a Nginx na prístup k hostiteľským službám

Ak chcete pripojiť kontajner Nginx k inštancii MySQL spustenej na hostiteľovi, musíme najprv vytvoriť sieťový most. Príkaz docker network create --driver bridge hostnetwork vytvára túto vlastnú sieť, ktorá umožňuje komunikáciu medzi kontajnermi v rovnakej sieti. Potom spustíme kontajnery MySQL a Nginx v tejto sieti pomocou docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest a docker run --name nginx-container --network hostnetwork -d nginx:latest, resp. Toto nastavenie umožňuje kontajnerom objavovať sa a komunikovať medzi sebou. Na pripojenie k MySQL z Nginx potrebujeme IP adresu hostiteľa, ktorú je možné získať host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Tento príkaz zachytáva IP adresu rozhrania docker0 na hostiteľovi.

Ďalej používame docker exec -it nginx-container bash na otvorenie interaktívneho shellu v kontajneri Nginx. Odtiaľ môžeme iniciovať pripojenie MySQL pomocou mysql -h $host_ip -u root -p, kde $host_ip je IP adresa hostiteľa. Prípadne použitie Docker Compose zjednoduší proces definovaním služieb a sietí v súbore YAML. The networks: hostnetwork: external: true konfigurácia zabezpečuje, že služby využívajú externe vytvorenú sieť. Nakoniec, aby sme nakonfigurovali Nginx na proxy požiadavky MySQL, aktualizujeme jeho konfiguračný súbor pomocou echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf a znova načítajte Nginx pomocou nginx -s reload. Toto nastavenie umožňuje Nginxu posielať požiadavky do inštancie MySQL spustenej na hostiteľovi.

Pripojenie kontajnera Docker k hostiteľovi MySQL cez sieťový most

Shell Script pre nastavenie siete 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

Použitie Docker Compose na prepojenie Nginx a MySQL hostiteľa

Docker Compose YAML Configuration

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

Konfigurácia Nginx na pripojenie k hostiteľovi MySQL pomocou siete Docker

Konfigurácia Nginx a sieťový príkaz 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

Pripojenie kontajnerov Docker na hosťovanie miestnych služieb

Pri spúšťaní aplikácií v kontajneroch Docker môže byť prístup k službám viazaným na lokálny hostiteľ hostiteľa náročný z dôvodu izolácie siete. Jedným z účinných prístupov je použitie režimu hostiteľskej siete Docker. Spustením kontajnera s --network host Kontajner zdieľa sieťový zásobník hostiteľa, čo mu umožňuje priamy prístup k službám viazaným na lokálneho hostiteľa. Tento režim je však menej prenosný a nemusí fungovať dobre vo všetkých prostrediach, ako je napríklad Docker Swarm alebo Kubernetes.

Ďalším prístupom je použitie vstavaného DNS resolvera Dockera, host.docker.internal. Tento špeciálny názov DNS sa prekladá na IP adresu hostiteľa, čo umožňuje kontajnerom komunikovať so službami na hostiteľovi. Táto metóda je jednoduchá a vyhýba sa zložitosti správy siete. Je však k dispozícii iba na Docker pre Windows a Mac, nie na Linuxe. Pre používateľov Linuxu je vytvorenie vlastnej premosťovacej siete a manuálna konfigurácia pravidiel smerovania životaschopným riešením. To zahŕňa použitie ip a iptables príkazy na smerovanie prevádzky z kontajnerovej siete do hostiteľského rozhrania localhost.

Bežné otázky týkajúce sa pripojenia kontajnerov Docker k hostiteľským službám

  1. Ako môžem použiť --network host možnosť v Dockeri?
  2. Spustite svoj kontajner pomocou docker run --network host zdieľať sieťový zásobník hostiteľa.
  3. Čo je host.docker.internal?
  4. Je to špeciálny názov DNS, ktorý sa priraďuje k IP adrese hostiteľa a je k dispozícii na Docker pre Windows a Mac.
  5. Môžem použiť host.docker.internal na Linuxe?
  6. Nie, táto funkcia nie je dostupná v Docker pre Linux.
  7. Ako môžem vytvoriť vlastnú premosťovaciu sieť?
  8. Použite docker network create --driver bridge my-bridge-network na vytvorenie vlastnej siete mostov.
  9. Aký je účel iptables príkaz?
  10. Spravuje pravidlá filtrovania sieťových paketov a smerovania na systémoch Linux.
  11. Ako sa pripojím k inštancii MySQL na hostiteľovi z kontajnera Docker?
  12. Použite mysql -h host.docker.internal -u root -p pre Docker na Windows/Mac alebo nakonfigurujte smerovanie pre Linux.
  13. Aké sú obmedzenia používania --network host?
  14. Môže to znížiť prenosnosť a nie je kompatibilné s niektorými orchestrátormi, ako je Kubernetes.
  15. Môžem pristupovať k iným službám na hostiteľovi okrem MySQL?
  16. Áno, pomocou rovnakých metód sa môžete pripojiť k akejkoľvek službe spustenej na hostiteľovi.

Záverečné myšlienky o prístupe k hostiteľským službám od Docker

Pripojenie k inštancii MySQL na hostiteľovi z kontajnera Nginx zahŕňa rôzne metódy, z ktorých každá má svoje výhody a obmedzenia. Použitie hostiteľskej siete, špeciálnych názvov DNS alebo vlastných sieťových mostov môže efektívne preklenúť medzeru a zabezpečiť hladkú komunikáciu medzi kontajnermi Docker a hostiteľskými službami. Pochopením a implementáciou týchto stratégií môžete prekonať problémy s izoláciou siete a udržiavať robustné pripojenia vo svojom dockerizovanom prostredí.