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.