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.