Use a resolução de nome de host do contêiner com network=host

Use a resolução de nome de host do contêiner com network=host

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.

informação relacionada