Cover Image

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.