Nginx savienošana programmā Docker ar Localhost MySQL resursdatorā

Nginx savienošana programmā Docker ar Localhost MySQL resursdatorā
Shell

Piekļuve Localhost pakalpojumiem no Docker konteineriem

Nginx palaišana Docker konteinerā, vienlaikus izveidojot savienojumu ar MySQL gadījumu resursdatorā, var būt sarežģīta, it īpaši, ja MySQL ir saistīts tikai ar vietējo resursdatoru. Šī iestatīšana neļauj konteineram tieši piekļūt MySQL pakalpojumam, izmantojot standarta tīkla metodes.

Šajā rakstā ir apskatīti dažādi risinājumi, lai pārvarētu šo plaisu, nodrošinot netraucētu savienojumu starp Docker konteineriem un pakalpojumiem, kas darbojas resursdatora lokālajā resursdatorā. Mēs apspriedīsim, kāpēc izplatītās metodes var būt nepietiekamas, un sniegsim praktiskus pasākumus, lai sasniegtu vēlamo savienojumu.

Pavēli Apraksts
docker network create --driver bridge hostnetwork Izveido pielāgotu Docker tīklu ar tilta draiveri, ļaujot konteineriem sazināties vienā tīklā.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Izvelk resursdatora docker0 saskarnes IP adresi, kas tiek izmantota, lai izveidotu savienojumu no konteinera ar resursdatora pakalpojumiem.
docker exec -it nginx-container bash Izpilda interaktīvu bash čaulu darbojošā Nginx konteinerā, lai nodrošinātu tiešu piekļuvi komandrindai.
mysql -h $host_ip -u root -p Komanda tiek izmantota Nginx konteinerā, lai izveidotu savienojumu ar MySQL serveri, kas darbojas resursdatorā, izmantojot izvilkto IP adresi.
networks: hostnetwork: external: true Konfigurācija programmā Docker Compose, lai izmantotu ārēji izveidotu Docker tīklu.
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 Raksta jaunu Nginx konfigurāciju, lai starpniekservera MySQL pieprasījumiem uz resursdatora mašīnu.
nginx -s reload Atkārtoti ielādē Nginx pakalpojumu, lai lietotu jaunās konfigurācijas izmaiņas.

Docker un Nginx konfigurēšana, lai piekļūtu resursdatora pakalpojumiem

Lai savienotu Nginx konteineru ar MySQL gadījumu, kas darbojas resursdatorā, vispirms ir jāizveido tīkla tilts. Komanda docker network create --driver bridge hostnetwork izveido šo pielāgoto tīklu, nodrošinot saziņu starp konteineriem vienā tīklā. Pēc tam mēs šajā tīklā palaižam MySQL un Nginx konteinerus, izmantojot docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest un docker run --name nginx-container --network hostnetwork -d nginx:latest, attiecīgi. Šī iestatīšana ļauj konteineriem atklāt un sazināties vienam ar otru. Lai izveidotu savienojumu ar MySQL no Nginx, mums ir nepieciešama resursdatora IP adrese, kuru var iegūt, izmantojot host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Šī komanda uztver resursdatora docker0 interfeisa IP adresi.

Tālāk mēs izmantojam docker exec -it nginx-container bash lai atvērtu interaktīvu apvalku Nginx konteinerā. No šejienes mēs varam uzsākt MySQL savienojumu, izmantojot mysql -h $host_ip -u root -p, kur $host_ip ir resursdatora IP adrese. Alternatīvi, izmantojot Docker Compose, process tiek vienkāršots, YAML failā definējot pakalpojumus un tīklus. The networks: hostnetwork: external: true konfigurācija nodrošina, ka pakalpojumi izmanto ārēji izveidotu tīklu. Visbeidzot, lai konfigurētu Nginx starpniekservera MySQL pieprasījumiem, mēs atjauninām tā konfigurācijas failu ar echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf un atkārtoti ielādējiet Nginx, izmantojot nginx -s reload. Šī iestatīšana ļauj Nginx pārsūtīt pieprasījumus uz MySQL gadījumu, kas darbojas resursdatorā.

Docker konteinera savienošana ar resursdatora MySQL, izmantojot tīkla tiltu

Shell skripts Docker tīkla iestatīšanai

# 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 izmantošana, lai saistītu Nginx un Host's MySQL

Docker Compose YAML konfigurācija

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 konfigurēšana, lai izveidotu savienojumu ar resursdatoru MySQL, izmantojot Docker tīklu

Nginx konfigurācija un Docker tīkla 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 konteineru savienošana ar vietējo pakalpojumu mitināšanu

Palaižot lietojumprogrammas Docker konteineros, piekļuve pakalpojumiem, kas saistīti ar resursdatora lokālo resursdatoru, var būt sarežģīti tīkla izolācijas dēļ. Viena efektīva pieeja ir Docker resursdatora tīkla režīma izmantošana. Iedarbinot konteineru ar --network host opciju, konteiners koplieto resursdatora tīkla steku, ļaujot tam tieši piekļūt ar lokālo resursdatoru saistītiem pakalpojumiem. Tomēr šis režīms ir mazāk pārnēsājams un var nedarboties labi visās vidēs, piemēram, Docker Swarm vai Kubernetes.

Vēl viena pieeja ir izmantot Docker iebūvēto DNS atrisinātāju, host.docker.internal. Šis īpašais DNS nosaukums tiek izmantots resursdatora IP adresē, ļaujot konteineriem sazināties ar resursdatora pakalpojumiem. Šī metode ir vienkārša un ļauj izvairīties no tīkla pārvaldības sarežģītības. Tomēr tas ir pieejams tikai Docker operētājsistēmai Windows un Mac, nevis Linux. Linux lietotājiem pielāgota tilta tīkla izveide un maršrutēšanas noteikumu manuāla konfigurēšana ir dzīvotspējīgs risinājums. Tas ietver izmantošanu ip un iptables komandas, lai maršrutētu trafiku no konteinera tīkla uz resursdatora localhost interfeisu.

Bieži uzdotie jautājumi par Docker konteineru pievienošanu resursdatora pakalpojumiem

  1. Kā es varu izmantot --network host opcija Docker?
  2. Palaidiet konteineru ar docker run --network host lai koplietotu resursdatora tīkla steku.
  3. Kas ir host.docker.internal?
  4. Tas ir īpašs DNS nosaukums, kas tiek izmantots resursdatora IP adresē un ir pieejams Docker operētājsistēmai Windows un Mac.
  5. Vai es varu izmantot host.docker.internal operētājsistēmā Linux?
  6. Nē, šī funkcija nav pieejama Docker operētājsistēmai Linux.
  7. Kā es varu izveidot pielāgotu tiltu tīklu?
  8. Izmantot docker network create --driver bridge my-bridge-network lai izveidotu pielāgotu tiltu tīklu.
  9. Kāds ir mērķis iptables komanda?
  10. Tas pārvalda tīkla pakešu filtrēšanas un maršrutēšanas noteikumus Linux sistēmās.
  11. Kā izveidot savienojumu ar MySQL gadījumu resursdatorā no Docker konteinera?
  12. Izmantot mysql -h host.docker.internal -u root -p Docker operētājsistēmā Windows/Mac vai konfigurējiet maršrutēšanu operētājsistēmai Linux.
  13. Kādi ir lietošanas ierobežojumi --network host?
  14. Tas var samazināt pārnesamību un nav saderīgs ar dažiem orķestrantiem, piemēram, Kubernetes.
  15. Vai varu piekļūt citiem resursdatora pakalpojumiem, izņemot MySQL?
  16. Jā, izmantojot tās pašas metodes, varat izveidot savienojumu ar jebkuru pakalpojumu, kas darbojas resursdatorā.

Pēdējās domas par piekļuvi resursdatora pakalpojumiem no Docker

Savienojuma izveide ar MySQL gadījumu resursdatorā no Nginx konteinera ietver dažādas metodes, katrai no tām ir savas priekšrocības un ierobežojumi. Izmantojot resursdatora tīklus, īpašus DNS nosaukumus vai pielāgotus tīkla tiltus, var efektīvi pārvarēt plaisu, nodrošinot vienmērīgu saziņu starp Docker konteineriem un resursdatora pakalpojumiem. Izprotot un ieviešot šīs stratēģijas, varat pārvarēt tīkla izolācijas problēmas un uzturēt stabilus savienojumus savā Dockerized vidē.