Localhost-palvelujen käyttö Docker Containersista
Nginxin käyttäminen Docker-säilön sisällä, kun on muodostettava yhteys isäntäkoneen MySQL-ilmentymään, voi olla haastavaa, varsinkin kun MySQL on sidottu vain localhost-palvelimeen. Tämä asetus estää säilöä pääsemästä suoraan MySQL-palveluun tavallisilla verkkomenetelmillä.
Tässä artikkelissa tarkastellaan erilaisia ratkaisuja tämän aukon kuromiseen, mikä mahdollistaa saumattoman yhteyden Docker-säilöjen ja isännän paikallisessa isäntäkoneessa toimivien palveluiden välillä. Keskustelemme siitä, miksi yleiset menetelmät voivat olla puutteellisia, ja tarjoamme käytännön vaiheita halutun yhteyden saavuttamiseksi.
Komento | Kuvaus |
---|---|
docker network create --driver bridge hostnetwork | Luo mukautetun Docker-verkon silta-ohjaimella, jolloin kontit voivat kommunikoida samassa verkossa. |
host_ip=$(ip -4 addr show docker0 | grep -oP '(? | Poimii isännän docker0-liitännän IP-osoitteen, jota käytetään yhteyden muodostamiseen säilöstä isäntäpalveluihin. |
docker exec -it nginx-container bash | Suorittaa interaktiivisen bash-kuoren käynnissä olevan Nginx-säilön sisällä suoraa komentorivikäyttöä varten. |
mysql -h $host_ip -u root -p | Nginx-säilön sisällä oleva komento muodostaa yhteyden isäntäkoneessa toimivaan MySQL-palvelimeen puretun IP-osoitteen avulla. |
networks: hostnetwork: external: true | Määritys Docker Composessa ulkoisesti luodun Docker-verkon käyttöä varten. |
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 | Kirjoittaa uuden Nginx-määrityksen välityspalvelimen MySQL-pyynnöille isäntäkoneelle. |
nginx -s reload | Lataa Nginx-palvelun uudelleen ottaakseen käyttöön uudet kokoonpanomuutokset. |
Dockerin ja Nginxin määrittäminen isäntäpalveluihin pääsyä varten
Yhdistääksemme Nginx-säilön isännässä käynnissä olevaan MySQL-ilmentymään meidän on ensin luotava verkkosilta. Käsky docker network create --driver bridge hostnetwork luo tämän mukautetun verkon, joka mahdollistaa viestinnän samassa verkossa olevien säiliöiden välillä. Käynnistämme sitten MySQL- ja Nginx-säilöt tässä verkossa käyttämällä docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest ja docker run --name nginx-container --network hostnetwork -d nginx:latest, vastaavasti. Tämän asennuksen avulla säiliöt voivat löytää ja kommunikoida keskenään. Yhdistääksemme MySQL:ään Nginxistä tarvitsemme isännän IP-osoitteen, joka voidaan saada host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Tämä komento kaappaa isäntäkoneen docker0-liitännän IP-osoitteen.
Seuraavaksi käytämme docker exec -it nginx-container bash avataksesi interaktiivisen kuoren Nginx-säiliössä. Täältä voimme aloittaa MySQL-yhteyden käyttämällä mysql -h $host_ip -u root -p, missä $host_ip on isännän IP-osoite. Vaihtoehtoisesti Docker Composen käyttö yksinkertaistaa prosessia määrittelemällä palvelut ja verkot YAML-tiedostossa. The networks: hostnetwork: external: true konfiguraatio varmistaa, että palvelut käyttävät ulkoisesti luotua verkkoa. Lopuksi, jotta Nginx voidaan määrittää välittämään MySQL-pyyntöjä, päivitämme sen määritystiedoston echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf ja lataa Nginx uudelleen käyttämällä nginx -s reload. Tämän asennuksen avulla Nginx voi välittää pyynnöt isännässä käynnissä olevaan MySQL-ilmentymään.
Docker Containerin yhdistäminen isännän MySQL:ään Network Bridgen kautta
Shell Script Docker Network Setupille
# 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 Composen käyttö linkittääksesi Nginxin ja Host's MySQL:n
Docker Compose YAML-kokoonpano
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
Nginxin määrittäminen muodostamaan yhteys MySQL-isäntään Docker Networkin avulla
Nginx-kokoonpano ja Docker-verkkokomento
# 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-säiliöiden yhdistäminen paikallisiin palveluihin
Kun sovelluksia suoritetaan Docker-säiliöissä, isäntäkoneen paikallispalvelimeen sidottujen palvelujen käyttäminen voi olla haastavaa verkon eristäytymisen vuoksi. Yksi tehokas tapa on käyttää Dockerin isäntäverkkotilaa. Käynnistämällä säiliön kanssa --network host Vaihtoehtoisesti säilö jakaa isännän verkkopinon, jolloin se voi käyttää suoraan paikallisiin isänteihin sidottuja palveluita. Tämä tila on kuitenkin vähemmän kannettava eikä välttämättä toimi hyvin kaikissa ympäristöissä, kuten Docker Swarmissa tai Kubernetesissa.
Toinen tapa on käyttää Dockerin sisäänrakennettua DNS-selvitinta, host.docker.internal. Tämä erityinen DNS-nimi ratkaisee isännän IP-osoitteen, jolloin säilöt voivat kommunikoida isännän palvelujen kanssa. Tämä menetelmä on suoraviivainen ja välttää verkonhallinnan monimutkaisuuden. Se on kuitenkin saatavilla vain Docker for Windowsille ja Macille, ei Linuxille. Linux-käyttäjille mukautetun siltaverkon luominen ja reitityssääntöjen manuaalinen määrittäminen on käyttökelpoinen ratkaisu. Tämä edellyttää ip ja iptables komennot reitittämään liikennettä säilöverkosta isännän localhost-liittymään.
Yleisiä kysymyksiä Docker-säilöjen yhdistämisestä isäntäpalveluihin
- Kuinka käytän --network host vaihtoehto Dockerissa?
- Suorita konttisi kanssa docker run --network host jakaaksesi isännän verkkopinon.
- Mikä on host.docker.internal?
- Se on erityinen DNS-nimi, joka ratkaisee isännän IP-osoitteen ja joka on saatavilla Docker for Windows- ja Mac -versiossa.
- Voinko käyttää host.docker.internal Linuxissa?
- Ei, tämä ominaisuus ei ole käytettävissä Docker for Linuxissa.
- Kuinka voin luoda mukautetun siltaverkon?
- Käyttää docker network create --driver bridge my-bridge-network luodaksesi mukautetun siltaverkon.
- Mikä on tarkoitus iptables komento?
- Se hallitsee verkkopakettien suodatusta ja reitityssääntöjä Linux-järjestelmissä.
- Kuinka voin muodostaa yhteyden isäntäkoneen MySQL-ilmentymään Docker-säilön kautta?
- Käyttää mysql -h host.docker.internal -u root -p Dockerille Windows/Macissa tai määritä reititys Linuxille.
- Mitkä ovat käytön rajoitukset --network host?
- Se saattaa heikentää siirrettävyyttä, eikä se ole yhteensopiva joidenkin orkestraattorien, kuten Kubernetesin, kanssa.
- Voinko käyttää muita palveluita isännässä kuin MySQL?
- Kyllä, samoilla menetelmillä voit muodostaa yhteyden mihin tahansa isännässä käynnissä olevaan palveluun.
Viimeisiä ajatuksia isäntäpalvelujen käyttämisestä Dockerista
Yhdistäminen isäntäkoneen MySQL-ilmentymään Nginx-säiliöstä sisältää erilaisia menetelmiä, joista jokaisella on omat etunsa ja rajoituksensa. Isäntäverkkojen, erityisten DNS-nimien tai mukautettujen verkkosiltojen käyttäminen voi tehokkaasti kuroa umpeen ja varmistaa sujuvan tiedonsiirron Docker-säilöjen ja isäntäpalvelujen välillä. Ymmärtämällä ja ottamalla nämä strategiat käyttöön voit voittaa verkon eristämiseen liittyvät haasteet ja ylläpitää kestäviä yhteyksiä Dockerized-ympäristössäsi.