Использовать разрешение имени хоста контейнера с помощью network=host

Использовать разрешение имени хоста контейнера с помощью network=host

У меня есть два контейнера Docker. Один - "бэкенд", другой - "коннектор"..

Для соединителя необходимо установить тип сети «хост» (для приема многоадресных пакетов UDP: ssdp/mdns).

Но он также должен иметь возможность использовать систему Docker DNS, чтобы я мог преобразовывать имена контейнеров в их IP-адреса.

Как я могу это сделать?

docker-compose.yml:

version: "3"
services:

  database:
    image: mongo
    container_name: database
    hostname: database
    ports:
      - "27017:27017"

  backend:
    image: "project/backend:latest"
    container_name: backend
    hostname: backend
    environment:
      - NODE_ENV=production
      - DATABASE_HOST=database
    ports:
      - "8080:8080"
    depends_on:
      - database
    tty: true

  connector:
    image: "project/connector:latest"
    container_name: connector
    hostname: connector
    ports:
      - "1900:1900/udp"
    environment:
      - NODE_ENV=production
      - BACKEND_HOST=backend
    depends_on:
      - backend
    network_mode: host
    tty: true

Когда я запускаю его с помощью docker compose up, мой контейнер-коннектор выдает ошибку «EAI_AGAIN»:

connector  | Error: getaddrinfo EAI_AGAIN backend
connector  |     at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:109:26) {
connector  |   errno: -3001,
connector  |   code: 'EAI_AGAIN',
connector  |   syscall: 'getaddrinfo',
connector  |   hostname: 'backend'
connector  | }

Это означает, что приложение node.js не может разрешить имя хоста "backend". Что неудивительно, поскольку сеть установлена ​​на "host".

Как сделать так, чтобы контейнер «connector» имел сеть «host», но при этом мог разрешать имена других контейнеров?

решение1

Docker macvlan устанавливает программный коммутатор (мост) на сетевом интерфейсе хоста по вашему выбору. Это может быть тот же интерфейс, что и хост, или другой интерфейс или подинтерфейс с другой сетью.

Назначение контейнера этой сети macvlan docker создаст уникальный адрес уровня 2 для контейнера и позволит ему использовать любой IP-адрес уровня 3, имеющий маршрут на родительском интерфейсе macvlan. Это также даст вашему контейнеру функциональность сети хоста, т. е. обнаружение сети mdns.

Контейнер, назначенный сети macvlan, может быть одновременно назначен другим сетям docker в вашем файле compose и взаимодействовать с другими контейнерами в сети docker. Используйте интерфейс macvlan как не более чем вход для любых данных, потребляемых остальной частью вашего стека.

Недостатки и соображения относительно такого подхода:

  • Конфигурация Macvlan должна быть направлена ​​на физический именованный интерфейс. Она также должна быть подключена к фактической сети уровня 2, к которой вы ее подключаете. Введение macvlan в вашу среду docker сделает ее менее переносимой.

  • Нет надлежащего способа для интерфейсов macvlan участвовать в DHCP. Docker может быть предоставлен диапазон для автоматического назначения контейнерам в сети macvlan, или вы можете индивидуально назначить статический IP каждому контейнеру. Обязательно удалите эти IP из области DHCP, чтобы избежать конфликтов.

Связанный контент