Підключення Nginx у Docker до Localhost MySQL на хост-машині

Підключення Nginx у Docker до Localhost MySQL на хост-машині
Shell

Доступ до служб Localhost із контейнерів Docker

Запуск 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. The 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 хосту через мережевий міст

Сценарій оболонки для налаштування мережі 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 хосту

Конфігурація 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

Налаштування 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 до локальних служб розміщення

Під час запуску програм у контейнерах Docker доступ до служб, пов’язаних із локальним хостом хоста, може бути складним через ізоляцію мережі. Одним з ефективних підходів є використання мережевого режиму хоста Docker. Запустивши контейнер з --network host Опція, контейнер спільно використовує мережевий стек хоста, дозволяючи йому отримувати прямий доступ до локальних служб. Однак цей режим є менш портативним і може працювати не в усіх середовищах, таких як Docker Swarm або Kubernetes.

Інший підхід полягає у використанні вбудованого DNS-перетворювача Docker, host.docker.internal. Це спеціальне DNS-ім’я перетворюється на IP-адресу хоста, дозволяючи контейнерам спілкуватися зі службами на хості. Цей метод є простим і дозволяє уникнути складнощів керування мережею. Однак він доступний лише на Docker для Windows і Mac, а не на Linux. Для користувачів Linux життєздатним рішенням є створення спеціальної мережі-мосту та ручне налаштування правил маршрутизації. Це передбачає використання ip і iptables команди для маршрутизації трафіку з контейнерної мережі до локального інтерфейсу хоста.

Поширені запитання щодо підключення контейнерів 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.