Verwenden Sie die Container-Hostnamenauflösung mit „network=host“

Verwenden Sie die Container-Hostnamenauflösung mit „network=host“

Ich habe zwei Docker-Container. Einer ist das „Backend“, der andere der „Connector“.

Der Netzwerktyp des Connectors muss auf „Host“ eingestellt sein (um UDP-Multicast: SSDP/MDNS-Pakete zu empfangen).

Es muss aber auch das Docker-DNS-System verwenden können, damit ich Containernamen in ihre IP-Adressen auflösen kann.

Wie kann ich das machen?

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

Wenn ich es mit ausführe docker compose up, gibt mein Connector-Container einen „EAI_AGAIN“-Fehler aus:

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  | }

Das bedeutet, dass die node.js-App den Hostnamen „backend“ nicht auflösen kann. Das ist keine Überraschung, da das Netzwerk auf „Host“ eingestellt ist.

Wie kann das Netzwerk des „Connector“-Containers auf „Host“ eingestellt sein, er kann aber trotzdem noch andere Containernamen auflösen?

Antwort1

Docker macvlan richtet einen Software-Switch (Bridge) auf einer Host-Netzwerkschnittstelle Ihrer Wahl ein. Dies kann dieselbe Schnittstelle wie der Host oder eine andere Schnittstelle oder Subschnittstelle mit einem anderen Netzwerk sein.

Durch die Zuweisung eines Containers zu diesem Macvlan-Docker-Netzwerk wird eine eindeutige Layer-2-Adresse für den Container erstellt und er kann jede Layer-3-IP-Adresse verwenden, die eine Route auf der übergeordneten Schnittstelle des Macvlan hat. Dadurch erhält Ihr Container auch die Netzwerkfunktionalität des Hosts, z. B. die MDNS-Netzwerkerkennung.

Ein dem Macvlan-Netzwerk zugewiesener Container kann in Ihrer Compose-Datei gleichzeitig anderen Docker-Netzwerken zugewiesen werden und mit den anderen Containern innerhalb des Docker-Netzwerks kommunizieren. Verwenden Sie die Macvlan-Schnittstelle lediglich als Eingang für alle Daten, die der Rest Ihres Stapels verbraucht.

Nachteile und Überlegungen zu dieser Vorgehensweise:

  • Die Macvlan-Konfiguration muss auf eine physisch benannte Schnittstelle zeigen. Sie muss außerdem mit dem tatsächlichen Layer-2-Netzwerk verbunden sein, mit dem Sie sie verbinden. Die Einführung von Macvlan in Ihre Docker-Umgebung macht es weniger portabel.

  • Es gibt keine richtige Möglichkeit für Macvlan-Schnittstellen, an DHCP teilzunehmen. Docker kann ein Bereich zugewiesen werden, um Container automatisch dem Macvlan-Netzwerk zuzuweisen, oder Sie können jedem Container einzeln eine statische IP zuweisen. Achten Sie darauf, diese IP(s) aus Ihrem DHCP-Bereich zu entfernen, um Konflikte zu vermeiden.

verwandte Informationen