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 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 a , 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 na otvorenie interaktívneho shellu v kontajneri Nginx. Odtiaľ môžeme iniciovať pripojenie MySQL pomocou , kde 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 a znova načítajte Nginx pomocou . 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 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, . 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 a 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ť možnosť v Dockeri?
  2. Spustite svoj kontajner pomocou zdieľať sieťový zásobník hostiteľa.
  3. Čo je ?
  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ť 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 na vytvorenie vlastnej siete mostov.
  9. Aký je účel 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 pre Docker na Windows/Mac alebo nakonfigurujte smerovanie pre Linux.
  13. Aké sú obmedzenia používania ?
  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í.