Eu tenho dois contêineres docker. Um é o "backend", o outro "conector".
O conector precisa ter seu tipo de rede definido como "host" (para receber multicast udp: pacotes ssdp/mdns).
Mas ele também precisa ser capaz de usar o sistema docker dns para que eu possa resolver nomes de contêineres para seus endereços IP.
Como posso fazer isso?
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
Quando eu o executo docker compose up
, meu contêiner do conector gera um erro "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 | }
O que significa que o aplicativo node.js não consegue resolver o nome do host "backend". O que não é surpresa, já que a rede está configurada como “host”.
Como o contêiner “conector” pode ter sua rede configurada como “host”, mas ainda é capaz de resolver outros nomes de contêiner?
Responder1
Docker macvlan configura um switch de software (ponte) em uma interface de rede host de sua escolha. Pode ser a mesma interface do host ou uma interface ou subinterface diferente com uma rede diferente.
Atribuir um contêiner a esta rede docker macvlan criará um endereço exclusivo de camada 2 para o contêiner e permitirá que ele use qualquer endereço IP de camada 3 que tenha uma rota na interface pai do macvlan. Isso também fornecerá funcionalidade de rede de host de contêiner, ou seja. descoberta de rede mdns.
Um contêiner atribuído à rede macvlan pode ser atribuído simultaneamente a outras redes docker em seu arquivo de composição e se comunicar com os outros contêineres na rede do docker. Use a interface macvlan como nada mais do que entrada para quaisquer dados que o restante da sua pilha esteja consumindo.
Desvantagens e considerações de fazer assim:
A configuração Macvlan precisa ser apontada para uma interface física nomeada. Ele também precisa estar conectado à rede real da camada 2 à qual você está conectando. A introdução do macvlan em seu ambiente docker o tornará menos portátil.
Não há uma maneira adequada de as interfaces macvlan participarem do DHCP. O Docker pode receber um intervalo para atribuir automaticamente aos contêineres da rede macvlan, ou você pode atribuir individualmente um IP estático a cada contêiner. Certifique-se de remover esses IP(s) do seu escopo DHCP para evitar conflitos.