У меня есть два контейнера 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, чтобы избежать конфликтов.