Łączenie Nginx w Dockerze z Localhost MySQL na komputerze hosta

Łączenie Nginx w Dockerze z Localhost MySQL na komputerze hosta
Shell

Dostęp do usług Localhost z kontenerów Docker

Uruchamianie Nginx w kontenerze Dockera podczas konieczności połączenia się z instancją MySQL na komputerze hosta może być wyzwaniem, szczególnie gdy MySQL jest powiązany tylko z hostem lokalnym. Ta konfiguracja uniemożliwia kontenerowi bezpośredni dostęp do usługi MySQL przy użyciu standardowych metod sieciowych.

W tym artykule omówiono różne rozwiązania mające na celu wypełnienie tej luki, umożliwiając bezproblemową łączność między kontenerami platformy Docker i usługami działającymi na hoście lokalnym hosta. Omówimy, dlaczego typowe metody mogą okazać się niewystarczające i przedstawimy praktyczne kroki umożliwiające osiągnięcie pożądanej łączności.

Komenda Opis
docker network create --driver bridge hostnetwork Tworzy niestandardową sieć Docker ze sterownikiem mostu, umożliwiając kontenerom komunikację w tej samej sieci.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Wyodrębnia adres IP interfejsu docker0 hosta, który jest używany do łączenia się z kontenera z usługami hosta.
docker exec -it nginx-container bash Wykonuje interaktywną powłokę bash wewnątrz działającego kontenera Nginx w celu uzyskania bezpośredniego dostępu z wiersza poleceń.
mysql -h $host_ip -u root -p Polecenie używane w kontenerze Nginx w celu połączenia się z serwerem MySQL działającym na komputerze hosta przy użyciu wyodrębnionego adresu IP.
networks: hostnetwork: external: true Konfiguracja w Docker Compose do korzystania z zewnętrznie utworzonej sieci 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 Zapisuje nową konfigurację Nginx w celu proxy żądań MySQL do komputera hosta.
nginx -s reload Ponownie ładuje usługę Nginx, aby zastosować nowe zmiany konfiguracji.

Konfigurowanie Dockera i Nginx w celu uzyskania dostępu do usług hosta

Aby połączyć kontener Nginx z instancją MySQL uruchomioną na hoście, musimy najpierw ustanowić most sieciowy. Komenda docker network create --driver bridge hostnetwork tworzy tę niestandardową sieć, umożliwiając komunikację między kontenerami w tej samej sieci. Następnie uruchamiamy kontenery MySQL i Nginx w tej sieci za pomocą docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest I docker run --name nginx-container --network hostnetwork -d nginx:latestodpowiednio. Ta konfiguracja umożliwia kontenerom wzajemne odnajdywanie i komunikowanie się. Aby połączyć się z MySQL z Nginx, potrzebujemy adresu IP hosta, który można uzyskać za pomocą host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). To polecenie przechwytuje adres IP interfejsu docker0 na hoście.

Dalej używamy docker exec -it nginx-container bash aby otworzyć interaktywną powłokę w kontenerze Nginx. Stąd możemy zainicjować połączenie MySQL za pomocą mysql -h $host_ip -u root -p, Gdzie $host_ip to adres IP hosta. Alternatywnie użycie Docker Compose upraszcza proces, definiując usługi i sieci w pliku YAML. The networks: hostnetwork: external: true konfiguracja zapewnia, że ​​usługi korzystają z sieci utworzonej zewnętrznie. Na koniec, aby skonfigurować Nginx do proxy żądań MySQL, aktualizujemy jego plik konfiguracyjny echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf i załaduj ponownie Nginx za pomocą nginx -s reload. Ta konfiguracja umożliwia Nginx przekazywanie żądań do instancji MySQL działającej na hoście.

Podłączanie kontenera Docker do MySQL hosta za pośrednictwem mostka sieciowego

Skrypt powłoki do konfiguracji sieci 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

Używanie Docker Compose do połączenia Nginx i MySQL hosta

Konfiguracja YAML Docker Compose

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

Konfigurowanie Nginx do łączenia się z hostem MySQL za pomocą sieci Docker

Konfiguracja Nginx i polecenie sieci 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

Łączenie kontenerów Docker z hostem usług lokalnych

Podczas uruchamiania aplikacji w kontenerach Docker dostęp do usług powiązanych z hostem lokalnym hosta może być trudny ze względu na izolację sieci. Jednym ze skutecznych podejść jest użycie trybu sieci hosta Dockera. Uruchamiając kontener za pomocą --network host opcja, kontener współdzieli stos sieciowy hosta, umożliwiając mu bezpośredni dostęp do usług powiązanych z hostem lokalnym. Jednak ten tryb jest mniej przenośny i może nie działać dobrze we wszystkich środowiskach, takich jak Docker Swarm lub Kubernetes.

Innym podejściem jest użycie wbudowanego modułu rozpoznawania nazw DNS Dockera, host.docker.internal. Ta specjalna nazwa DNS jest tłumaczona na adres IP hosta, umożliwiając kontenerom komunikację z usługami na hoście. Metoda ta jest prosta i pozwala uniknąć zawiłości związanych z zarządzaniem siecią. Jest jednak dostępny tylko w Dockerze dla systemów Windows i Mac, a nie w systemie Linux. Dla użytkowników Linuksa realnym rozwiązaniem jest utworzenie niestandardowej sieci mostowej i ręczne skonfigurowanie reguł routingu. Wiąże się to z użyciem ip I iptables polecenia do kierowania ruchu z sieci kontenerowej do interfejsu localhost hosta.

Często zadawane pytania dotyczące łączenia kontenerów Docker z usługami hosta

  1. Jak korzystać z --network host opcja w Dockerze?
  2. Uruchom swój kontener za pomocą docker run --network host aby udostępnić stos sieciowy hosta.
  3. Co jest host.docker.internal?
  4. Jest to specjalna nazwa DNS, która jest rozpoznawana jako adres IP hosta, dostępna w Dockerze dla systemów Windows i Mac.
  5. Mogę uzyć host.docker.internal na Linuksie?
  6. Nie, ta funkcja nie jest dostępna w Dockerze dla systemu Linux.
  7. Jak mogę utworzyć niestandardową sieć mostową?
  8. Używać docker network create --driver bridge my-bridge-network aby utworzyć niestandardową sieć mostową.
  9. Jaki jest cel iptables Komenda?
  10. Zarządza regułami filtrowania pakietów sieciowych i routingu w systemach Linux.
  11. Jak połączyć się z instancją MySQL na hoście z kontenera Docker?
  12. Używać mysql -h host.docker.internal -u root -p dla Dockera na Windows/Mac lub skonfiguruj routing dla Linuksa.
  13. Jakie są ograniczenia użytkowania --network host?
  14. Może zmniejszyć przenośność i nie jest kompatybilny z niektórymi koordynatorami, takimi jak Kubernetes.
  15. Czy mogę uzyskać dostęp do innych usług na hoście oprócz MySQL?
  16. Tak, używając tych samych metod, możesz połączyć się z dowolną usługą uruchomioną na hoście.

Końcowe przemyślenia na temat dostępu do usług hosta z poziomu platformy Docker

Łączenie się z instancją MySQL na hoście z kontenera Nginx obejmuje różne metody, z których każda ma swoje zalety i ograniczenia. Korzystanie z sieci hostów, specjalnych nazw DNS lub niestandardowych mostów sieciowych może skutecznie wypełnić lukę, zapewniając płynną komunikację między kontenerami Docker a usługami hosta. Rozumiejąc i wdrażając te strategie, można pokonać wyzwania związane z izolacją sieci i utrzymać niezawodne połączenia w środowisku dokowanym.