Σύνδεση του Nginx στο Docker με το Localhost MySQL στο Host Machine

Σύνδεση του Nginx στο Docker με το Localhost MySQL στο Host Machine
Shell

Πρόσβαση στις υπηρεσίες Localhost από Docker Containers

Η εκτέλεση του Nginx μέσα σε ένα κοντέινερ Docker ενώ χρειάζεται να συνδεθείτε σε μια παρουσία MySQL στον κεντρικό υπολογιστή μπορεί να είναι δύσκολη, ειδικά όταν η MySQL είναι δεσμευμένη μόνο σε localhost. Αυτή η ρύθμιση εμποδίζει το κοντέινερ να αποκτήσει απευθείας πρόσβαση στην υπηρεσία MySQL χρησιμοποιώντας τυπικές μεθόδους δικτύωσης.

Αυτό το άρθρο διερευνά διάφορες λύσεις για να γεφυρώσει αυτό το χάσμα, επιτρέποντας την απρόσκοπτη συνδεσιμότητα μεταξύ των κοντέινερ Docker και των υπηρεσιών που εκτελούνται στον τοπικό κεντρικό υπολογιστή του κεντρικού υπολογιστή. Θα συζητήσουμε γιατί οι κοινές μέθοδοι ενδέχεται να αποτύχουν και θα παρέχουμε πρακτικά βήματα για την επίτευξη της επιθυμητής συνδεσιμότητας.

Εντολή Περιγραφή
docker network create --driver bridge hostnetwork Δημιουργεί ένα προσαρμοσμένο δίκτυο Docker με πρόγραμμα οδήγησης γέφυρας, επιτρέποντας στα κοντέινερ να επικοινωνούν μέσα στο ίδιο δίκτυο.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Εξάγει τη διεύθυνση IP της διεπαφής docker0 του κεντρικού υπολογιστή, η οποία χρησιμοποιείται για τη σύνδεση από το κοντέινερ στις υπηρεσίες κεντρικού υπολογιστή.
docker exec -it nginx-container bash Εκτελεί ένα διαδραστικό κέλυφος bash μέσα στο τρέχον κοντέινερ Nginx για άμεση πρόσβαση στη γραμμή εντολών.
mysql -h $host_ip -u root -p Εντολή που χρησιμοποιείται μέσα στο κοντέινερ Nginx για σύνδεση με τον διακομιστή MySQL που εκτελείται στον κεντρικό υπολογιστή χρησιμοποιώντας την εξαγόμενη διεύθυνση IP.
networks: hostnetwork: external: true Διαμόρφωση στο Docker Compose για χρήση ενός εξωτερικά δημιουργημένου δικτύου 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 Γράφει μια νέα διαμόρφωση Nginx για να διαμεσολαβεί αιτήματα MySQL στον κεντρικό υπολογιστή.
nginx -s reload Φορτώνει ξανά την υπηρεσία Nginx για να εφαρμόσει τις νέες αλλαγές διαμόρφωσης.

Ρύθμιση παραμέτρων Docker και Nginx για πρόσβαση στις υπηρεσίες κεντρικού υπολογιστή

Για να συνδέσουμε ένα κοντέινερ Nginx σε μια παρουσία MySQL που εκτελείται στον κεντρικό υπολογιστή, πρέπει πρώτα να δημιουργήσουμε μια γέφυρα δικτύου. Η εντολή docker network create --driver bridge hostnetwork δημιουργεί αυτό το προσαρμοσμένο δίκτυο, επιτρέποντας την επικοινωνία μεταξύ κοντέινερ στο ίδιο δίκτυο. Στη συνέχεια ξεκινάμε τα κοντέινερ MySQL και Nginx σε αυτό το δίκτυο χρησιμοποιώντας docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest και docker run --name nginx-container --network hostnetwork -d nginx:latest, αντίστοιχα. Αυτή η ρύθμιση επιτρέπει στα κοντέινερ να ανακαλύπτουν και να επικοινωνούν μεταξύ τους. Για να συνδεθείτε στη MySQL από το Nginx, χρειαζόμαστε τη διεύθυνση IP του κεντρικού υπολογιστή, με την οποία μπορείτε να αποκτήσετε host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Αυτή η εντολή καταγράφει τη διεύθυνση IP της διεπαφής docker0 στον κεντρικό υπολογιστή.

Στη συνέχεια, χρησιμοποιούμε docker exec -it nginx-container bash για να ανοίξετε ένα διαδραστικό κέλυφος στο κοντέινερ Nginx. Από εδώ, μπορούμε να ξεκινήσουμε μια σύνδεση MySQL χρησιμοποιώντας mysql -h $host_ip -u root -p, που $host_ip είναι η διεύθυνση IP του κεντρικού υπολογιστή. Εναλλακτικά, η χρήση του Docker Compose απλοποιεί τη διαδικασία ορίζοντας υπηρεσίες και δίκτυα σε ένα αρχείο YAML. ο networks: hostnetwork: external: true Η ρύθμιση παραμέτρων διασφαλίζει ότι οι υπηρεσίες χρησιμοποιούν ένα δίκτυο που δημιουργήθηκε εξωτερικά. Τέλος, για να ρυθμίσουμε το Nginx σε αιτήματα διακομιστή μεσολάβησης MySQL, ενημερώνουμε το αρχείο διαμόρφωσής του με echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf και φορτώστε ξανά το Nginx χρησιμοποιώντας nginx -s reload. Αυτή η ρύθμιση επιτρέπει στο Nginx να προωθήσει αιτήματα στην παρουσία MySQL που εκτελείται στον κεντρικό υπολογιστή.

Σύνδεση Docker Container με τη MySQL του κεντρικού υπολογιστή μέσω Network Bridge

Σενάριο Shell για Ρύθμιση δικτύου 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

Χρήση Docker Compose για σύνδεση Nginx και MySQL του Host

Docker Compose YAML Configuration

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 για σύνδεση στον κεντρικό υπολογιστή MySQL χρησιμοποιώντας το δίκτυο Docker

Διαμόρφωση Nginx και Εντολή δικτύου 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

Σύνδεση Docker Containers με Host Local Services

Κατά την εκτέλεση εφαρμογών σε κοντέινερ Docker, η πρόσβαση σε υπηρεσίες που συνδέονται με τον τοπικό κεντρικό υπολογιστή του κεντρικού υπολογιστή μπορεί να είναι δύσκολη λόγω απομόνωσης δικτύου. Μια αποτελεσματική προσέγγιση είναι η χρήση της λειτουργίας δικτύωσης κεντρικού υπολογιστή Docker. Ξεκινώντας ένα δοχείο με το --network host επιλογή, το κοντέινερ μοιράζεται τη στοίβα δικτύου του κεντρικού υπολογιστή, επιτρέποντάς του να έχει άμεση πρόσβαση σε υπηρεσίες που συνδέονται με τον τοπικό κεντρικό υπολογιστή. Ωστόσο, αυτή η λειτουργία είναι λιγότερο φορητή και ενδέχεται να μην λειτουργεί καλά σε όλα τα περιβάλλοντα, όπως το Docker Swarm ή το Kubernetes.

Μια άλλη προσέγγιση είναι η χρήση του ενσωματωμένου προγράμματος επίλυσης DNS του Docker, host.docker.internal. Αυτό το ειδικό όνομα DNS αναλύεται στη διεύθυνση IP του κεντρικού υπολογιστή, επιτρέποντας στα κοντέινερ να επικοινωνούν με υπηρεσίες στον κεντρικό υπολογιστή. Αυτή η μέθοδος είναι απλή και αποφεύγει τις πολυπλοκότητες της διαχείρισης δικτύου. Ωστόσο, είναι διαθέσιμο μόνο στο Docker για Windows και Mac, όχι σε Linux. Για τους χρήστες Linux, η δημιουργία ενός προσαρμοσμένου δικτύου γέφυρας και η μη αυτόματη διαμόρφωση κανόνων δρομολόγησης είναι μια βιώσιμη λύση. Αυτό περιλαμβάνει τη χρήση του ip και iptables εντολές για τη δρομολόγηση της κυκλοφορίας από το δίκτυο κοντέινερ στη διεπαφή localhost του κεντρικού υπολογιστή.

Συνήθεις ερωτήσεις σχετικά με τη σύνδεση κοντέινερ Docker σε υπηρεσίες κεντρικού υπολογιστή

  1. Πώς μπορώ να χρησιμοποιήσω το --network host επιλογή στο Docker;
  2. Λειτουργήστε το δοχείο σας με docker run --network host για κοινή χρήση της στοίβας δικτύου του κεντρικού υπολογιστή.
  3. Τι είναι host.docker.internal?
  4. Είναι ένα ειδικό όνομα DNS που αναλύεται στη διεύθυνση IP του κεντρικού υπολογιστή, διαθέσιμο στο Docker για Windows και Mac.
  5. Μπορώ να χρησιμοποιήσω host.docker.internal στο Linux;
  6. Όχι, αυτή η δυνατότητα δεν είναι διαθέσιμη στο Docker για Linux.
  7. Πώς μπορώ να δημιουργήσω ένα προσαρμοσμένο δίκτυο γέφυρας;
  8. Χρήση docker network create --driver bridge my-bridge-network για να δημιουργήσετε ένα προσαρμοσμένο δίκτυο γέφυρας.
  9. Ποιος είναι ο σκοπός του iptables εντολή;
  10. Διαχειρίζεται κανόνες φιλτραρίσματος πακέτων δικτύου και δρομολόγησης σε συστήματα Linux.
  11. Πώς μπορώ να συνδεθώ σε μια παρουσία MySQL στον κεντρικό υπολογιστή από ένα κοντέινερ Docker;
  12. Χρήση mysql -h host.docker.internal -u root -p για Docker σε Windows/Mac ή διαμορφώστε τη δρομολόγηση για Linux.
  13. Ποιοι είναι οι περιορισμοί χρήσης --network host?
  14. Μπορεί να μειώσει τη φορητότητα και δεν είναι συμβατό με ορισμένους ενορχηστρωτές όπως ο Kubernetes.
  15. Μπορώ να έχω πρόσβαση σε άλλες υπηρεσίες στον κεντρικό υπολογιστή εκτός από τη MySQL;
  16. Ναι, χρησιμοποιώντας τις ίδιες μεθόδους, μπορείτε να συνδεθείτε σε οποιαδήποτε υπηρεσία που εκτελείται στον κεντρικό υπολογιστή.

Τελικές σκέψεις σχετικά με την πρόσβαση σε υπηρεσίες κεντρικού υπολογιστή από το Docker

Η σύνδεση σε μια παρουσία MySQL στον κεντρικό υπολογιστή από ένα κοντέινερ Nginx περιλαμβάνει διάφορες μεθόδους, καθεμία με τα δικά της οφέλη και περιορισμούς. Η χρήση δικτύωσης κεντρικού υπολογιστή, ειδικών ονομάτων DNS ή προσαρμοσμένων γεφυρών δικτύου μπορεί να γεφυρώσει αποτελεσματικά το χάσμα, διασφαλίζοντας την ομαλή επικοινωνία μεταξύ των κοντέινερ Docker και των υπηρεσιών κεντρικού υπολογιστή. Κατανοώντας και εφαρμόζοντας αυτές τις στρατηγικές, μπορείτε να ξεπεράσετε τις προκλήσεις απομόνωσης δικτύου και να διατηρήσετε ισχυρές συνδέσεις στο περιβάλλον Dockerized.