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.