Utilice la resolución del nombre de host del contenedor con network=host

Utilice la resolución del nombre de host del contenedor con network=host

Tengo dos contenedores acoplables. Uno es el "backend", el otro "conector"..

El conector debe tener su tipo de red configurado en "host" (para recibir multidifusión udp: paquetes ssdp/mdns).

Pero también debe poder utilizar el sistema Docker DNS para poder resolver los nombres de los contenedores en sus direcciones IP.

¿Cómo puedo hacer esto?

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

Cuando lo ejecuto docker compose up, mi contenedor de conector arroja un error "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  | }

Lo que significa que la aplicación node.js no puede resolver el nombre de host "backend". Lo cual no es una sorpresa ya que la red está configurada como "host".

¿Cómo es posible que el contenedor "conector" tenga su red configurada en "host" pero aún pueda resolver otros nombres de contenedores?

Respuesta1

Docker macvlan configura un conmutador de software (puente) en una interfaz de red de host de su elección. Esta podría ser la misma interfaz que el host o una interfaz o subinterfaz diferente con una red diferente.

Asignar un contenedor a esta red acoplable macvlan creará una dirección de capa 2 única para el contenedor y le permitirá usar cualquier dirección IP de capa 3 que tenga una ruta en la interfaz principal de macvlan. Esto también le dará a su contenedor funcionalidad de red host, es decir. descubrimiento de red mdns.

Un contenedor asignado a la red macvlan se puede asignar simultáneamente a otras redes acoplables en su archivo de redacción y comunicarse con los otros contenedores dentro de la red acoplable. Utilice la interfaz macvlan como nada más que un ingreso para cualquier dato que esté consumiendo el resto de su pila.

Desventajas y consideraciones de hacerlo así:

  • La configuración de Macvlan debe apuntar a una interfaz física con nombre. También debe estar conectado a la red de capa 2 real a la que lo está conectando. Introducir macvlan en su entorno acoplable lo hará menos portátil.

  • No existe una forma adecuada para que las interfaces macvlan participen en DHCP. A Docker se le puede dar un rango para asignar automáticamente contenedores a la red macvlan, o puede asignar individualmente una IP estática a cada contenedor. Asegúrese de eliminar esas direcciones IP de su alcance DHCP para evitar conflictos.

información relacionada