Připojení Nginx v Dockeru k Localhost MySQL na hostitelském počítači

Připojení Nginx v Dockeru k Localhost MySQL na hostitelském počítači
Shell

Přístup ke službám Localhost z kontejnerů Docker

Spuštění Nginx uvnitř kontejneru Docker při potřebě připojení k instanci MySQL na hostitelském počítači může být náročné, zvláště když je MySQL vázáno pouze na localhost. Toto nastavení zabrání kontejneru v přímém přístupu ke službě MySQL pomocí standardních síťových metod.

Tento článek zkoumá různá řešení, jak tuto mezeru překlenout a umožnit bezproblémovou konektivitu mezi kontejnery Docker a službami běžícími na hostiteli localhost. Probereme, proč mohou běžné metody selhat, a poskytneme praktické kroky k dosažení požadované konektivity.

Příkaz Popis
docker network create --driver bridge hostnetwork Vytvoří vlastní síť Docker s ovladačem mostu, což umožňuje kontejnerům komunikovat v rámci stejné sítě.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Extrahuje IP adresu hostitelského rozhraní docker0, které se používá k připojení z kontejneru k hostitelským službám.
docker exec -it nginx-container bash Spouští interaktivní bash shell uvnitř běžícího kontejneru Nginx pro přímý přístup z příkazového řádku.
mysql -h $host_ip -u root -p Příkaz používaný uvnitř kontejneru Nginx k připojení k serveru MySQL běžícímu na hostitelském počítači pomocí extrahované IP adresy.
networks: hostnetwork: external: true Konfigurace v Docker Compose pro použití externě vytvořené sítě 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 novou konfiguraci Nginx pro proxy požadavky MySQL na hostitelský počítač.
nginx -s reload Znovu načte službu Nginx, aby se uplatnily nové změny konfigurace.

Konfigurace Dockeru a Nginx pro přístup ke službám hostitele

Chcete-li připojit kontejner Nginx k instanci MySQL běžící na hostiteli, musíme nejprve vytvořit síťový most. Příkaz docker network create --driver bridge hostnetwork vytvoří tuto vlastní síť a umožní komunikaci mezi kontejnery ve stejné síti. Poté spustíme kontejnery MySQL a Nginx v této síti pomocí 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 nastavení umožňuje kontejnerům objevovat se a komunikovat mezi sebou. Pro připojení k MySQL z Nginx potřebujeme IP adresu hostitele, kterou lze získat host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Tento příkaz zachytí IP adresu rozhraní docker0 na hostiteli.

Dále použijeme docker exec -it nginx-container bash k otevření interaktivního shellu v kontejneru Nginx. Odtud můžeme zahájit připojení MySQL pomocí mysql -h $host_ip -u root -p, kde $host_ip je IP adresa hostitele. Případně použití Docker Compose zjednoduší proces definováním služeb a sítí v souboru YAML. The networks: hostnetwork: external: true konfigurace zajišťuje, že služby využívají externě vytvořenou síť. Nakonec, abychom nakonfigurovali Nginx na proxy požadavky MySQL, aktualizujeme jeho konfigurační soubor pomocí echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf a znovu načtěte Nginx pomocí nginx -s reload. Toto nastavení umožňuje Nginxu předávat požadavky instanci MySQL běžící na hostiteli.

Připojení Docker Container k MySQL hostitele přes Network Bridge

Shell Script pro nastavení sítě 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žití Docker Compose k propojení Nginx a MySQL hostitele

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

Konfigurace Nginx pro připojení k hostiteli MySQL pomocí sítě Docker

Konfigurace Nginx a síťový pří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

Připojení kontejnerů Docker k hostiteli místních služeb

Při spouštění aplikací v kontejnerech Docker může být přístup ke službám vázaným na localhost hostitele náročný kvůli izolaci sítě. Jedním z účinných přístupů je použití režimu hostitelské sítě Docker. Spuštěním kontejneru s --network host Kontejner sdílí síťový zásobník hostitele, což mu umožňuje přímý přístup ke službám vázaným na localhost. Tento režim je však méně přenosný a nemusí fungovat dobře ve všech prostředích, jako je Docker Swarm nebo Kubernetes.

Dalším přístupem je použití vestavěného DNS resolveru společnosti Docker, host.docker.internal. Tento speciální název DNS se překládá na IP adresu hostitele a umožňuje kontejnerům komunikovat se službami na hostiteli. Tato metoda je přímočará a vyhýbá se složitosti správy sítě. Je však k dispozici pouze na Dockeru pro Windows a Mac, nikoli na Linuxu. Pro uživatele Linuxu je vytvoření vlastní přemosťovací sítě a ruční konfigurace pravidel směrování schůdným řešením. To zahrnuje použití ip a iptables příkazy pro směrování provozu z kontejnerové sítě do hostitelského rozhraní localhost.

Běžné otázky o připojení kontejnerů Docker k hostitelským službám

  1. Jak mohu použít --network host možnost v Dockeru?
  2. Spusťte svůj kontejner pomocí docker run --network host sdílet síťový zásobník hostitele.
  3. co je host.docker.internal?
  4. Jedná se o speciální název DNS, který se překládá na IP adresu hostitele a je k dispozici na Dockeru pro Windows a Mac.
  5. Mohu použít host.docker.internal na Linuxu?
  6. Ne, tato funkce není v Dockeru pro Linux dostupná.
  7. Jak mohu vytvořit vlastní mostovou síť?
  8. Použití docker network create --driver bridge my-bridge-network vytvořit vlastní mostovou síť.
  9. Jaký je účel iptables příkaz?
  10. Spravuje filtrování síťových paketů a pravidla směrování na systémech Linux.
  11. Jak se připojím k instanci MySQL na hostiteli z kontejneru Docker?
  12. Použití mysql -h host.docker.internal -u root -p pro Docker na Windows/Mac nebo nakonfigurujte směrování pro Linux.
  13. Jaká jsou omezení použití --network host?
  14. Může snížit přenositelnost a není kompatibilní s některými orchestrátory, jako je Kubernetes.
  15. Mohu na hostiteli přistupovat k jiným službám kromě MySQL?
  16. Ano, pomocí stejných metod se můžete připojit k jakékoli službě běžící na hostiteli.

Závěrečné myšlenky o přístupu k hostitelským službám z Dockeru

Připojení k instanci MySQL na hostiteli z kontejneru Nginx zahrnuje různé metody, z nichž každá má své výhody a omezení. Pomocí hostitelské sítě, speciálních názvů DNS nebo vlastních síťových mostů lze efektivně překlenout mezeru a zajistit hladkou komunikaci mezi kontejnery Docker a hostitelskými službami. Pochopením a implementací těchto strategií můžete překonat problémy s izolací sítě a udržovat robustní připojení ve vašem dockerizovaném prostředí.