Kết nối Nginx trong Docker với Localhost MySQL trên Máy chủ

Kết nối Nginx trong Docker với Localhost MySQL trên Máy chủ
Kết nối Nginx trong Docker với Localhost MySQL trên Máy chủ

Truy cập dịch vụ Localhost từ Docker Container

Chạy Nginx bên trong vùng chứa Docker trong khi cần kết nối với phiên bản MySQL trên máy chủ có thể là một thách thức, đặc biệt khi MySQL chỉ bị ràng buộc với localhost. Thiết lập này ngăn vùng chứa truy cập trực tiếp vào dịch vụ MySQL bằng các phương thức mạng tiêu chuẩn.

Bài viết này khám phá các giải pháp khác nhau để thu hẹp khoảng cách này, cho phép kết nối liền mạch giữa các bộ chứa Docker và các dịch vụ chạy trên localhost của máy chủ. Chúng ta sẽ thảo luận lý do tại sao các phương pháp phổ biến có thể thiếu sót và cung cấp các bước thực tế để đạt được kết nối mong muốn.

Yêu cầu Sự miêu tả
docker network create --driver bridge hostnetwork Tạo mạng Docker tùy chỉnh với trình điều khiển cầu nối, cho phép các container giao tiếp trong cùng một mạng.
host_ip=$(ip -4 addr show docker0 | grep -oP '(? Trích xuất địa chỉ IP của giao diện docker0 của máy chủ, được sử dụng để kết nối từ vùng chứa với các dịch vụ máy chủ.
docker exec -it nginx-container bash Thực thi bash shell tương tác bên trong bộ chứa Nginx đang chạy để truy cập dòng lệnh trực tiếp.
mysql -h $host_ip -u root -p Lệnh được sử dụng bên trong bộ chứa Nginx để kết nối với máy chủ MySQL đang chạy trên máy chủ bằng địa chỉ IP được trích xuất.
networks: hostnetwork: external: true Cấu hình trong Docker Compose để sử dụng mạng Docker được tạo bên ngoài.
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 Viết cấu hình Nginx mới để ủy quyền các yêu cầu MySQL tới máy chủ.
nginx -s reload Tải lại dịch vụ Nginx để áp dụng các thay đổi cấu hình mới.

Định cấu hình Docker và Nginx để truy cập dịch vụ máy chủ

Để kết nối bộ chứa Nginx với phiên bản MySQL chạy trên máy chủ, trước tiên chúng ta cần thiết lập một cầu nối mạng. Lệnh docker network create --driver bridge hostnetwork tạo mạng tùy chỉnh này, cho phép liên lạc giữa các vùng chứa trên cùng một mạng. Sau đó, chúng tôi khởi động vùng chứa MySQL và Nginx trên mạng này bằng cách sử dụng docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latestdocker run --name nginx-container --network hostnetwork -d nginx:latest, tương ứng. Thiết lập này cho phép các container khám phá và liên lạc với nhau. Để kết nối với MySQL từ Nginx, chúng tôi cần địa chỉ IP của máy chủ, có thể lấy được bằng host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'). Lệnh này lấy địa chỉ IP của giao diện docker0 trên máy chủ.

Tiếp theo, chúng tôi sử dụng docker exec -it nginx-container bash để mở shell tương tác trong vùng chứa Nginx. Từ đây, chúng ta có thể bắt đầu kết nối MySQL bằng cách sử dụng mysql -h $host_ip -u root -p, Ở đâu $host_ip là địa chỉ IP của máy chủ. Ngoài ra, việc sử dụng Docker Compose sẽ đơn giản hóa quy trình bằng cách xác định các dịch vụ và mạng trong tệp YAML. Các networks: hostnetwork: external: true cấu hình đảm bảo rằng các dịch vụ sử dụng mạng được tạo bên ngoài. Cuối cùng, để định cấu hình Nginx cho các yêu cầu MySQL proxy, chúng tôi cập nhật tệp cấu hình của nó với số 8 và tải lại Nginx bằng cách sử dụng nginx -s reload. Thiết lập này cho phép Nginx chuyển tiếp yêu cầu tới phiên bản MySQL đang chạy trên máy chủ.

Kết nối Docker Container với Host MySQL qua Network Bridge

Shell Script để thiết lập mạng 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

Sử dụng Docker Compose để liên kết Nginx và MySQL của Host

Docker Soạn cấu hình YAML

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

Định cấu hình Nginx để kết nối với máy chủ MySQL bằng mạng Docker

Cấu hình Nginx và lệnh mạng 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

Kết nối vùng chứa Docker với dịch vụ lưu trữ cục bộ

Khi chạy các ứng dụng trong vùng chứa Docker, việc truy cập các dịch vụ được liên kết với máy chủ cục bộ của máy chủ có thể gặp khó khăn do cách ly mạng. Một cách tiếp cận hiệu quả là sử dụng chế độ kết nối mạng máy chủ của Docker. Bằng cách khởi động một container với --network host tùy chọn, vùng chứa chia sẻ ngăn xếp mạng của máy chủ, cho phép nó truy cập trực tiếp vào các dịch vụ liên kết với máy chủ cục bộ. Tuy nhiên, chế độ này ít di động hơn và có thể không hoạt động tốt trong mọi môi trường, chẳng hạn như Docker Swarm hoặc Kubernetes.

Một cách tiếp cận khác là sử dụng trình phân giải DNS tích hợp của Docker, host.docker.internal. Tên DNS đặc biệt này phân giải thành địa chỉ IP của máy chủ, cho phép các vùng chứa liên lạc với các dịch vụ trên máy chủ. Phương pháp này đơn giản và tránh được sự phức tạp trong quản lý mạng. Tuy nhiên, nó chỉ có trên Docker cho Windows và Mac chứ không có trên Linux. Đối với người dùng Linux, việc tạo mạng cầu nối tùy chỉnh và cấu hình quy tắc định tuyến theo cách thủ công là một giải pháp khả thi. Điều này liên quan đến việc sử dụng ipiptables các lệnh định tuyến lưu lượng truy cập từ mạng container đến giao diện localhost của máy chủ.

Các câu hỏi thường gặp về việc kết nối vùng chứa Docker với dịch vụ máy chủ

  1. Làm cách nào để sử dụng --network host tùy chọn trong Docker?
  2. Chạy container của bạn với docker run --network host để chia sẻ ngăn xếp mạng của máy chủ.
  3. Là gì host.docker.internal?
  4. Đó là tên DNS đặc biệt phân giải thành địa chỉ IP của máy chủ, có sẵn trên Docker cho Windows và Mac.
  5. Tôi có thể sử dụng không? host.docker.internal trên Linux?
  6. Không, tính năng này không có trên Docker dành cho Linux.
  7. Làm cách nào tôi có thể tạo mạng cầu tùy chỉnh?
  8. Sử dụng docker network create --driver bridge my-bridge-network để tạo ra một mạng cầu tùy chỉnh.
  9. Mục đích của việc này là gì iptables yêu cầu?
  10. Nó quản lý các quy tắc định tuyến và lọc gói mạng trên hệ thống Linux.
  11. Làm cách nào để kết nối với phiên bản MySQL trên máy chủ từ bộ chứa Docker?
  12. Sử dụng mysql -h host.docker.internal -u root -p cho Docker trên Windows/Mac hoặc định cấu hình định tuyến cho Linux.
  13. Hạn chế của việc sử dụng là gì --network host?
  14. Nó có thể làm giảm tính di động và không tương thích với một số bộ điều phối như Kubernetes.
  15. Tôi có thể truy cập các dịch vụ khác trên máy chủ ngoài MySQL không?
  16. Có, bằng cách sử dụng các phương pháp tương tự, bạn có thể kết nối với bất kỳ dịch vụ nào đang chạy trên máy chủ.

Suy nghĩ cuối cùng về việc truy cập dịch vụ máy chủ từ Docker

Việc kết nối với phiên bản MySQL trên máy chủ từ vùng chứa Nginx bao gồm nhiều phương pháp khác nhau, mỗi phương pháp đều có những lợi ích và hạn chế riêng. Việc sử dụng mạng máy chủ, tên DNS đặc biệt hoặc cầu nối mạng tùy chỉnh có thể thu hẹp khoảng cách một cách hiệu quả, đảm bảo liên lạc thông suốt giữa các bộ chứa Docker và dịch vụ máy chủ. Bằng cách hiểu và triển khai các chiến lược này, bạn có thể vượt qua các thách thức cách ly mạng và duy trì các kết nối mạnh mẽ trong môi trường Dockerized của mình.