Auf Docker Container aus einem anderen Netzwerk zugreifen

Auf Docker Container aus einem anderen Netzwerk zugreifen

Ich arbeite seit ein paar Monaten mit ddev. Das ist ein Tool um schnell PHP Entwicklungsumgebungen in Docker-Containern zu starten. Das Tool nutzt docker-compose im Hintergrund.

Zwecks einer Demo musste ich jetzt Node-RED hochfahren. Dabei handelt es sich um eine Software die in NodeJS geschrieben wurde. Da ddev für PHP Umgebungen ausgelegt ist. habe ich die Software schnell über eine selbstgeschriebene docker-compose.yml hochgefahren.

Auf den ersten Blick lief alles super bis ich merkte, dass die Container sich nicht sehen!

Mein Ziel war es von Node-RED auf den ddev Container "ddev-webhooks-magento2-web" zuzugreifen. Dazu stellt docker-compose die Möglichkeit bereit einen Container über die Konfiguration external_links bekanntzumachen.

services:
   node-red:
      # ....
      external_links:
         - ddev-webhooks-magento2-web

Der Zugriff funktioniert alleine damit aber noch nicht. Denn die Container sind in unterschiedlichen Docker-Netzwerken. Das ist auch gut so, denn docker-compose legt als Standard für jede Umgebung ein eigenes Docker-Netzwerk an.

Docker-Netzwerke kann man einfach mit folgendem Befehl auflisten:

docker network ls

Das sieht bei mir dann so aus:

NETWORK ID          NAME                     DRIVER              SCOPE
dd99c270ded1        bridge                   bridge              local
f42267f388c3        ddev_default             bridge              local
7147ccb3758a        host                     host                local
809ffae8da58        node-red_default         bridge              local
7a02fa1d3936        none                     null                local

Um nun auf den Container aus dem ddev_default Netzwerk zuzugreifen muss man nun noch ein externes Netzwerk deklarieren.

networks:
  ddev_default:
    external: true

Danach kann man das Netzwerk dem Service bekanntgeben. Das automatisch von docker-compose generierte Netzwerk hat in der docker-compose.yml immer den Namen default.

Zusammengefügt sieht das jetzt für meine Demo so aus:

version: "3.7"

services:
  node-red:
    container_name: node-red
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Berlin
    user: root:root
    restart: unless-stopped
    external_links:
      - ddev-webhooks-magento2-web
    networks:
      - default
      - ddev_default
    ports:
      - "1880:1880"
    volumes:
      - ./volumes/data:/data:rw

networks:
  ddev_default:
    external: true

Innerhalb meines node-red Workflows konnte ich jetzt direkt per HTTP auf den Container zugreifen.

Ziel erreicht.