„Nginx“ prijungimas „Docker“ prie „Localhost MySQL“ pagrindiniame kompiuteryje

„Nginx“ prijungimas „Docker“ prie „Localhost MySQL“ pagrindiniame kompiuteryje
Shell

Prieiga prie „Localhost“ paslaugų iš „Docker“ konteinerių

„Nginx“ paleidimas „Docker“ konteineryje, kai reikia prisijungti prie „MySQL“ egzemplioriaus pagrindiniame kompiuteryje, gali būti sudėtinga, ypač kai „MySQL“ susieta tik su „localhost“. Ši sąranka neleidžia konteineriui tiesiogiai pasiekti MySQL paslaugos naudojant standartinius tinklo metodus.

Šiame straipsnyje nagrinėjami įvairūs sprendimai, kaip užpildyti šią spragą, leidžiantį sklandų ryšį tarp „Docker“ konteinerių ir paslaugų, veikiančių pagrindinio kompiuterio vietiniame priegloboje. Aptarsime, kodėl įprasti metodai gali būti netinkami, ir pateiksime praktinius žingsnius norimam ryšiui pasiekti.

komandą apibūdinimas
docker network create --driver bridge hostnetwork Sukuria tinkintą Docker tinklą su tilto tvarkykle, leidžiančiu konteineriams susisiekti tame pačiame tinkle.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Ištraukia pagrindinio kompiuterio docker0 sąsajos IP adresą, kuris naudojamas prisijungti iš konteinerio prie pagrindinio kompiuterio paslaugų.
docker exec -it nginx-container bash Vykdo interaktyvų bash apvalkalą veikiančiame Nginx konteineryje, kad būtų galima tiesiogiai pasiekti komandų eilutę.
mysql -h $host_ip -u root -p Komanda, naudojama Nginx konteineryje, norint prisijungti prie „MySQL“ serverio, veikiančio pagrindiniame kompiuteryje, naudojant išskirtą IP adresą.
networks: hostnetwork: external: true „Docker Compose“ konfigūracija norint naudoti išoriškai sukurtą „Docker“ tinklą.
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 Rašo naują Nginx konfigūraciją, kad tarpinio serverio MySQL užklausos į pagrindinį kompiuterį.
nginx -s reload Iš naujo įkelia „Nginx“ paslaugą, kad būtų pritaikyti nauji konfigūracijos pakeitimai.

„Docker“ ir „Nginx“ konfigūravimas norint pasiekti pagrindinio kompiuterio paslaugas

Norėdami prijungti Nginx konteinerį prie pagrindiniame kompiuteryje veikiančio MySQL egzemplioriaus, pirmiausia turime sukurti tinklo tiltą. Komanda docker network create --driver bridge hostnetwork sukuria šį tinkintą tinklą, įgalinantį ryšį tarp konteinerių tame pačiame tinkle. Tada šiame tinkle paleidžiame „MySQL“ ir „Nginx“ konteinerius naudodami docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest ir docker run --name nginx-container --network hostnetwork -d nginx:latest, atitinkamai. Ši sąranka leidžia konteineriams atrasti ir bendrauti tarpusavyje. Norėdami prisijungti prie MySQL iš Nginx, mums reikia pagrindinio kompiuterio IP adreso, kurį galima gauti naudojant host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Ši komanda užfiksuoja pagrindinio kompiuterio docker0 sąsajos IP adresą.

Toliau mes naudojame docker exec -it nginx-container bash Norėdami atidaryti interaktyvų apvalkalą Nginx konteineryje. Iš čia mes galime inicijuoti MySQL ryšį naudodami mysql -h $host_ip -u root -p, kur $host_ip yra pagrindinio kompiuterio IP adresas. Arba naudojant Docker Compose procesas supaprastinamas apibrėžiant paslaugas ir tinklus YAML faile. The networks: hostnetwork: external: true konfigūracija užtikrina, kad paslaugos naudotų išoriškai sukurtą tinklą. Galiausiai, norėdami sukonfigūruoti „Nginx“, kad gautų tarpinio serverio MySQL užklausas, atnaujiname jo konfigūracijos failą echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf ir iš naujo įkelkite „Nginx“ naudodami nginx -s reload. Ši sąranka leidžia „Nginx“ persiųsti užklausas „MySQL“ egzemplioriui, veikiančiam pagrindiniame kompiuteryje.

Docker konteinerio prijungimas prie pagrindinio kompiuterio MySQL per tinklo tiltą

„Shell“ scenarijus, skirtas „Docker“ tinklo sąrankai

# 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

„Docker Compose“ naudojimas norint susieti „Nginx“ ir „Host's MySQL“.

Docker Compose YAML konfigūracija

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

„Nginx“ konfigūravimas prisijungti prie pagrindinio kompiuterio „MySQL“ naudojant „Docker“ tinklą

„Nginx“ konfigūracija ir „Docker“ tinklo komanda

# 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

„Docker“ konteinerių prijungimas prie vietinių paslaugų

Vykdant programas Docker konteineriuose, prieiga prie paslaugų, susietų su pagrindinio kompiuterio vietiniu kompiuteriu, gali būti sudėtinga dėl tinklo izoliacijos. Vienas iš veiksmingų būdų yra naudoti „Docker“ pagrindinio kompiuterio tinklo režimą. Pradedant konteinerį su --network host Pasirinkus parinktį, sudėtinis rodinys bendrina pagrindinio kompiuterio tinklo krūvą, leidžiantį tiesiogiai pasiekti su vietiniu kompiuteriu susietas paslaugas. Tačiau šis režimas yra mažiau nešiojamas ir gali neveikti visose aplinkose, pvz., „Docker Swarm“ ar „Kubernetes“.

Kitas būdas yra naudoti „Docker“ įtaisytąjį DNS sprendiklį, host.docker.internal. Šis specialus DNS pavadinimas išsprendžiamas į pagrindinio kompiuterio IP adresą, leidžiantį konteineriams susisiekti su pagrindinio kompiuterio paslaugomis. Šis metodas yra paprastas ir leidžia išvengti tinklo valdymo sudėtingumo. Tačiau ji pasiekiama tik „Docker“, skirta „Windows“ ir „Mac“, o ne „Linux“. Linux naudotojams tinkamas sprendimas yra sukurti tinkintą tilto tinklą ir rankiniu būdu konfigūruoti maršruto parinkimo taisykles. Tai apima naudojimą ip ir iptables komandos nukreipia srautą iš konteinerio tinklo į pagrindinio kompiuterio „localhost“ sąsają.

Dažni klausimai apie „Docker“ konteinerių prijungimą prie prieglobos paslaugų

  1. Kaip aš naudoju --network host parinktis „Docker“?
  2. Paleiskite konteinerį su docker run --network host bendrinti pagrindinio kompiuterio tinklo krūvą.
  3. Kas yra host.docker.internal?
  4. Tai specialus DNS pavadinimas, kuris paverčiamas pagrindinio kompiuterio IP adresu, pasiekiamas „Docker“, skirtoje „Windows“ ir „Mac“.
  5. Ar galiu naudoti host.docker.internal Linux sistemoje?
  6. Ne, ši funkcija nepasiekiama „Docker“, skirta Linux.
  7. Kaip galiu sukurti pasirinktinį tilto tinklą?
  8. Naudokite docker network create --driver bridge my-bridge-network sukurti pasirinktinį tilto tinklą.
  9. Koks yra tikslas iptables komandą?
  10. Jis valdo tinklo paketų filtravimą ir maršruto parinkimo taisykles Linux sistemose.
  11. Kaip prisijungti prie „MySQL“ egzemplioriaus pagrindiniame kompiuteryje iš „Docker“ konteinerio?
  12. Naudokite mysql -h host.docker.internal -u root -p „Docker“ sistemoje „Windows“ / „Mac“ arba sukonfigūruokite maršrutą, skirtą „Linux“.
  13. Kokie yra naudojimo apribojimai --network host?
  14. Tai gali sumažinti perkeliamumą ir nesuderinama su kai kuriais orkestrantais, pvz., Kubernetes.
  15. Ar galiu pasiekti kitas pagrindinio kompiuterio paslaugas, išskyrus „MySQL“?
  16. Taip, naudodami tuos pačius metodus galite prisijungti prie bet kurios pagrindiniame kompiuteryje veikiančios paslaugos.

Paskutinės mintys apie prieigą prie prieglobos paslaugų iš „Docker“.

Prisijungimas prie pagrindinio kompiuterio MySQL egzemplioriaus iš Nginx konteinerio apima įvairius metodus, kurių kiekvienas turi savo privalumų ir apribojimų. Naudojant pagrindinio kompiuterio tinklą, specialius DNS pavadinimus arba pasirinktinius tinklo tiltus, galima veiksmingai užpildyti atotrūkį ir užtikrinti sklandų ryšį tarp „Docker“ konteinerių ir prieglobos paslaugų. Suprasdami ir įgyvendindami šias strategijas, galite įveikti tinklo izoliavimo iššūkius ir išlaikyti tvirtus ryšius savo Dockerized aplinkoje.