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 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í a , 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 k otevření interaktivního shellu v kontejneru Nginx. Odtud můžeme zahájit připojení MySQL pomocí , kde 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í a znovu načtěte Nginx pomocí . 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 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, . 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í a 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 možnost v Dockeru?
  2. Spusťte svůj kontejner pomocí sdílet síťový zásobník hostitele.
  3. co je ?
  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 na Linuxu?
  6. Ne, tato funkce není v Dockeru pro Linux dostupná.
  7. Jak mohu vytvořit vlastní mostovou síť?
  8. Použití vytvořit vlastní mostovou síť.
  9. Jaký je účel 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í pro Docker na Windows/Mac nebo nakonfigurujte směrování pro Linux.
  13. Jaká jsou omezení použití ?
  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í.