A Localhost szolgáltatások elérése a Docker-tárolókból
Az Nginx futtatása egy Docker-tárolóban, miközben egy MySQL-példányhoz kell csatlakozni a gazdagépen, kihívást jelenthet, különösen akkor, ha a MySQL csak a localhosthoz van kötve. Ez a beállítás megakadályozza, hogy a tároló közvetlenül hozzáférjen a MySQL szolgáltatáshoz szabványos hálózati módszerekkel.
Ez a cikk különféle megoldásokat tár fel ennek a szakadéknak az áthidalására, lehetővé téve a zökkenőmentes kapcsolatot a Docker-tárolók és a gazdagép localhost-ján futó szolgáltatások között. Megvitatjuk, hogy a gyakori módszerek miért maradnak el, és gyakorlati lépéseket teszünk a kívánt kapcsolat eléréséhez.
Parancs | Leírás |
---|---|
docker network create --driver bridge hostnetwork | Egyéni Docker-hálózatot hoz létre egy híd-illesztőprogrammal, lehetővé téve a konténerek számára, hogy ugyanazon a hálózaton belül kommunikáljanak. |
host_ip=$(ip -4 addr show docker0 | grep -oP '(? | Kivonja a gazdagép docker0 interfészének IP-címét, amely a konténer és a gazdagép szolgáltatások közötti csatlakozásra szolgál. |
docker exec -it nginx-container bash | Interaktív bash shellt hajt végre a futó Nginx tárolóban a közvetlen parancssori hozzáférés érdekében. |
mysql -h $host_ip -u root -p | Az Nginx-tárolón belüli parancs a gazdagépen futó MySQL-kiszolgálóhoz való csatlakozáshoz a kibontott IP-cím használatával. |
networks: hostnetwork: external: true | A Docker Compose beállítása külsőleg létrehozott Docker-hálózat használatához. |
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 | Új Nginx-konfigurációt ír a MySQL kérések proxyjához a gazdagéphez. |
nginx -s reload | Újratölti az Nginx szolgáltatást az új konfigurációs módosítások alkalmazásához. |
A Docker és az Nginx konfigurálása a gazdagép szolgáltatások eléréséhez
Egy Nginx-tároló csatlakoztatásához a gazdagépen futó MySQL-példányhoz először hálózati hidat kell létrehoznunk. A parancs docker network create --driver bridge hostnetwork létrehozza ezt az egyéni hálózatot, lehetővé téve a kommunikációt ugyanazon a hálózaton lévő tárolók között. Ezután elindítjuk a MySQL és Nginx konténereket ezen a hálózaton docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest és docker run --name nginx-container --network hostnetwork -d nginx:latest, ill. Ez a beállítás lehetővé teszi, hogy a konténerek felfedezzék és kommunikáljanak egymással. A MySQL-hez való csatlakozáshoz az Nginx-ről szükségünk van a gazdagép IP-címére, amelyet a következővel lehet megszerezni host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Ez a parancs rögzíti a docker0 interfész IP-címét a gazdagépen.
Ezután használjuk docker exec -it nginx-container bash interaktív héj megnyitásához az Nginx tárolóban. Innentől MySQL kapcsolatot kezdeményezhetünk a használatával mysql -h $host_ip -u root -p, ahol $host_ip a gazdagép IP-címe. Alternatív megoldásként a Docker Compose használata leegyszerűsíti a folyamatot a szolgáltatások és hálózatok YAML-fájlban történő meghatározásával. A networks: hostnetwork: external: true A konfiguráció biztosítja, hogy a szolgáltatások külsőleg létrehozott hálózatot használjanak. Végül, hogy az Nginxet a MySQL kérések proxyjára állítsuk be, frissítjük a konfigurációs fájlját a következővel echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf és töltse be újra az Nginxet a használatával nginx -s reload. Ez a beállítás lehetővé teszi, hogy az Nginx kéréseket továbbítson a gazdagépen futó MySQL-példányhoz.
Docker Container csatlakoztatása a Host MySQL-hez a Network Bridge segítségével
Shell Script a Docker hálózati beállításhoz
# 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
A Docker Compose használata az Nginx és a Host MySQL összekapcsolásához
Docker Compose YAML konfiguráció
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
Az Nginx konfigurálása a MySQL gazdagéphez való csatlakozáshoz Docker Network használatával
Nginx Configuration és Docker Network Command
# 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-tárolók csatlakoztatása a helyi szolgáltatásokhoz
Amikor az alkalmazásokat Docker-tárolókban futtatja, a gazdagép helyi gazdagépéhez kötött szolgáltatások elérése kihívást jelenthet a hálózati elszigeteltség miatt. Az egyik hatékony módszer a Docker gazdagép hálózati módjának használata. Egy konténer elindításával a --network host opció esetén a tároló megosztja a gazdagép hálózati veremét, lehetővé téve számára, hogy közvetlenül hozzáférjen a helyi gazdagéphez kötött szolgáltatásokhoz. Ez a mód azonban kevésbé hordozható, és előfordulhat, hogy nem működik jól minden környezetben, például a Docker Swarmban vagy a Kubernetesben.
Egy másik megközelítés a Docker beépített DNS-feloldójának használata, host.docker.internal. Ez a speciális DNS-név a gazdagép IP-címét adja meg, lehetővé téve a konténerek számára, hogy kommunikáljanak a gazdagépen található szolgáltatásokkal. Ez a módszer egyszerű, és elkerüli a hálózatkezelés bonyolultságát. Azonban csak a Docker for Windows és Mac rendszeren érhető el, Linuxon nem. A Linux-felhasználók számára életképes megoldás az egyéni hídhálózat létrehozása és az útválasztási szabályok kézi konfigurálása. Ez magában foglalja a ip és iptables parancsok, amelyek a forgalmat a tárolóhálózatból a gazdagép localhost felületére irányítják.
Gyakori kérdések a Docker-tárolók csatlakoztatásával kapcsolatban a gazdagép szolgáltatásokhoz
- Hogyan használom a --network host opció a Dockerben?
- Futtassa a tárolót ezzel docker run --network host a gazdagép hálózati veremének megosztásához.
- Mi a host.docker.internal?
- Ez egy speciális DNS-név, amely a gazdagép IP-címét adja meg, és elérhető a Docker for Windows és Mac rendszeren.
- Használhatom host.docker.internal Linuxon?
- Nem, ez a funkció nem érhető el a Docker for Linux rendszeren.
- Hogyan hozhatok létre egyéni hídhálózatot?
- Használat docker network create --driver bridge my-bridge-network egyéni hídhálózat létrehozásához.
- Mi a célja a iptables parancs?
- Ez kezeli a hálózati csomagszűrést és az útválasztási szabályokat Linux rendszereken.
- Hogyan csatlakozhatok egy MySQL-példányhoz a gazdagépen egy Docker-tárolóból?
- Használat mysql -h host.docker.internal -u root -p Dockerhez Windows/Mac rendszeren, vagy konfigurálja az útválasztást Linuxhoz.
- Milyen korlátai vannak a használatnak --network host?
- Csökkentheti a hordozhatóságot, és nem kompatibilis néhány hangszerelővel, mint például a Kubernetes.
- Hozzáférhetek más szolgáltatásokhoz a gazdagépen a MySQL-n kívül?
- Igen, ugyanezekkel a módszerekkel csatlakozhat a gazdagépen futó bármely szolgáltatáshoz.
Utolsó gondolatok a gazdaszolgáltatások Dockerből való elérésével kapcsolatban
Az Nginx-tárolóból a gazdagépen található MySQL-példányhoz való csatlakozás különféle módszereket foglal magában, mindegyiknek megvannak a maga előnyei és korlátai. A gazdagép-hálózatok, a speciális DNS-nevek vagy az egyéni hálózati hidak használatával hatékonyan áthidalható a szakadék, biztosítva a zökkenőmentes kommunikációt a Docker-tárolók és a gazdagép-szolgáltatások között. Ezen stratégiák megértésével és megvalósításával legyőzheti a hálózat elszigetelésével kapcsolatos kihívásokat, és robusztus kapcsolatokat tarthat fenn Dockerizált környezetben.