Povezovanje Nginx v Dockerju z Localhost MySQL na gostiteljskem računalniku

Povezovanje Nginx v Dockerju z Localhost MySQL na gostiteljskem računalniku
Shell

Dostop do storitev Localhost iz vsebnikov Docker

Zagon Nginxa znotraj vsebnika Docker, medtem ko se je treba povezati z instanco MySQL na gostiteljskem računalniku, je lahko izziv, zlasti če je MySQL vezan samo na lokalnega gostitelja. Ta nastavitev preprečuje vsebniku neposreden dostop do storitve MySQL z uporabo standardnih omrežnih metod.

Ta članek raziskuje različne rešitve za premostitev te vrzeli, kar omogoča brezhibno povezljivost med vsebniki Docker in storitvami, ki se izvajajo na gostiteljevem lokalnem gostitelju. Razpravljali bomo o tem, zakaj so običajne metode neučinkovite, in podali praktične korake za doseganje želene povezljivosti.

Ukaz Opis
docker network create --driver bridge hostnetwork Ustvari omrežje Docker po meri z gonilnikom mostu, ki omogoča, da vsebniki komunicirajo znotraj istega omrežja.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Ekstrahira naslov IP gostiteljevega vmesnika docker0, ki se uporablja za povezavo iz vsebnika s storitvami gostitelja.
docker exec -it nginx-container bash Izvede interaktivno lupino bash znotraj delujočega vsebnika Nginx za neposreden dostop v ukazni vrstici.
mysql -h $host_ip -u root -p Ukaz, ki se uporablja znotraj vsebnika Nginx za povezavo s strežnikom MySQL, ki se izvaja na gostiteljskem računalniku, z uporabo ekstrahiranega naslova IP.
networks: hostnetwork: external: true Konfiguracija v Docker Compose za uporabo zunanje ustvarjenega omrežja 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 Zapiše novo konfiguracijo Nginx za posredniške zahteve MySQL gostiteljskemu računalniku.
nginx -s reload Znova naloži storitev Nginx za uporabo novih sprememb konfiguracije.

Konfiguriranje Dockerja in Nginxa za dostop do gostiteljskih storitev

Za povezavo vsebnika Nginx z instanco MySQL, ki se izvaja na gostitelju, moramo najprej vzpostaviti omrežni most. Ukaz docker network create --driver bridge hostnetwork ustvari to omrežje po meri, ki omogoča komunikacijo med vsebniki v istem omrežju. Nato zaženemo vsebnike MySQL in Nginx v tem omrežju z uporabo docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest in docker run --name nginx-container --network hostnetwork -d nginx:latest, oz. Ta nastavitev omogoča vsebnikom odkrivanje in medsebojno komunikacijo. Za povezavo z MySQL iz Nginxa potrebujemo naslov IP gostitelja, ki ga lahko pridobimo s host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Ta ukaz zajame naslov IP vmesnika docker0 na gostitelju.

Nato uporabimo docker exec -it nginx-container bash da odprete interaktivno lupino v vsebniku Nginx. Od tu lahko sprožimo povezavo MySQL z uporabo mysql -h $host_ip -u root -p, kje $host_ip je naslov IP gostitelja. Druga možnost je, da uporaba Docker Compose poenostavi postopek z definiranjem storitev in omrežij v datoteki YAML. The networks: hostnetwork: external: true konfiguracija zagotavlja, da storitve uporabljajo zunanje ustvarjeno omrežje. Končno, da konfiguriramo Nginx za proxy zahteve MySQL, posodobimo njegovo konfiguracijsko datoteko z echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf in znova naložite Nginx z uporabo nginx -s reload. Ta nastavitev omogoča Nginxu, da posreduje zahteve instanci MySQL, ki se izvaja na gostitelju.

Povezovanje vsebnika Docker z MySQL gostitelja prek omrežnega mostu

Lupinski skript za nastavitev omrežja 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

Uporaba Docker Compose za povezovanje Nginxa in gostiteljevega MySQL

Docker Compose YAML konfiguracija

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

Konfiguriranje Nginxa za povezavo z gostiteljem MySQL z uporabo omrežja Docker

Konfiguracija Nginx in omrežni ukaz 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

Povezovanje Dockerjevih vsebnikov z gostiteljskimi lokalnimi storitvami

Pri izvajanju aplikacij v vsebnikih Docker je lahko dostopanje do storitev, vezanih na lokalnega gostitelja gostitelja, izziv zaradi omrežne izolacije. Eden od učinkovitih pristopov je uporaba Dockerjevega gostiteljskega omrežnega načina. Z zagonom vsebnika z --network host možnost, vsebnik deli gostiteljev omrežni sklad, kar mu omogoča neposreden dostop do storitev, vezanih na lokalnega gostitelja. Vendar je ta način manj prenosljiv in morda ne bo dobro deloval v vseh okoljih, kot sta Docker Swarm ali Kubernetes.

Drug pristop je uporaba Dockerjevega vgrajenega razreševalnika DNS, host.docker.internal. To posebno ime DNS se razreši v naslov IP gostitelja, kar vsebnikom omogoča komunikacijo s storitvami na gostitelju. Ta metoda je preprosta in se izogne ​​zapletenosti upravljanja omrežja. Vendar pa je na voljo samo v Dockerju za Windows in Mac, ne pa v Linuxu. Za uporabnike Linuxa je izvedljiva rešitev ustvarjanje premostitvenega omrežja po meri in ročno konfiguriranje pravil usmerjanja. To vključuje uporabo ip in iptables ukaze za usmerjanje prometa iz vsebniškega omrežja na gostiteljev vmesnik localhost.

Pogosta vprašanja o povezovanju vsebnikov Docker z gostiteljskimi storitvami

  1. Kako naj uporabim --network host možnost v Dockerju?
  2. Zaženite svojo posodo z docker run --network host za skupno rabo omrežnega sklada gostitelja.
  3. Kaj je host.docker.internal?
  4. To je posebno ime DNS, ki se razreši v naslov IP gostitelja in je na voljo na Dockerju za Windows in Mac.
  5. Ali lahko uporabim host.docker.internal na Linuxu?
  6. Ne, ta funkcija ni na voljo v Dockerju za Linux.
  7. Kako lahko ustvarim premostitveno omrežje po meri?
  8. Uporaba docker network create --driver bridge my-bridge-network za ustvarjanje premostitvenega omrežja po meri.
  9. Kakšen je namen iptables ukaz?
  10. Upravlja filtriranje omrežnih paketov in pravila usmerjanja v sistemih Linux.
  11. Kako se povežem z instanco MySQL na gostitelju iz vsebnika Docker?
  12. Uporaba mysql -h host.docker.internal -u root -p za Docker v sistemu Windows/Mac ali konfigurirajte usmerjanje za Linux.
  13. Kakšne so omejitve uporabe --network host?
  14. Lahko zmanjša prenosljivost in ni združljiv z nekaterimi orkestratorji, kot je Kubernetes.
  15. Ali lahko dostopam do drugih storitev na gostitelju poleg MySQL?
  16. Da, z istimi metodami se lahko povežete s katero koli storitvijo, ki se izvaja na gostitelju.

Končne misli o dostopu do gostiteljskih storitev iz Dockerja

Povezovanje z instanco MySQL na gostitelju iz vsebnika Nginx vključuje različne metode, od katerih ima vsaka svoje prednosti in omejitve. Uporaba gostiteljskega omrežja, posebnih imen DNS ali omrežnih mostov po meri lahko učinkovito premosti vrzel in zagotovi gladko komunikacijo med vsebniki Docker in gostiteljskimi storitvami. Z razumevanjem in izvajanjem teh strategij lahko premagate izzive omrežne izolacije in vzdržujete robustne povezave v svojem okolju Dockerized.