Ich versuche, eine Webanwendung, die von einem Container bereitgestellt wird, mit RabbitMQ zu verbinden, das in einem anderen Container bereitgestellt wird.
Indem ich mich auf diese Verbindung zum RabbitMQ-Container mit Docker-Compose verlassen habe, habe ich das folgende Docker-Compose erstellt:
version: '3'
services:
webapp:
container_name: chat
build:
context: .
depends_on:
- broker
ports:
- "8080:8080"
broker:
container_name: rabbit_chat
image: rabbitmq
command: rabbitmq-server
expose:
- 5672
- 15672
healthcheck:
test: ["CMD", "curl", "-f", "http://broker:5672"]
interval: 30s
timeout: 10s
retries: 5
webapp ist ein Dienst einer Web-Anwendung, bei dem ich folgende rabbitmq-Eigenschaften vorschreibe:
host = broker
port = 15672
login = guest
password = guest
Ich habe „Broker“ als Host ausgewählt, da in der Dokumentation empfohlen wird, Container per Default-Net zu verbinden und dabei den Dienstnamen in Docker-Compose zu verwenden.
Und das funktioniert nicht. Außerdem habe ich versucht, „localhost“ als Host für die Verbindung zu verwenden.
Darüber hinaus sehe ich beim Untersuchen des Containers „rabbit_chat“ in der Ausgabe:
"Log": [
{
"Start": "2020-04-11T14:54:25.0988242Z",
"End": "2020-04-11T14:54:25.2920557Z",
"ExitCode": -1,
"Output": "OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused \"exec: \\\"curl\\\": executable file not found in $PATH\": unknown"
}
Antwort1
Versuchen SieNetzwerk:
services:
webapp:
...
networks:
- mynetwork
broker:
...
networks:
- mynetwork
networks:
mynetwork:
Dadurch wird auch ein interner DNS eingerichtet, sodass Sie ihn tatsächlich broker
als Hostnamen verwenden können webapp
, um auf den anderen Container zu verweisen.
Antwort2
Aus Ihren Kommentaren geht hervor, dass es eher Probleme mit den Zugriffsberechtigungen als Probleme mit den Docker-Ports gibt.
Versuchen Sie zunächst, curl aus dem Rabbit-MQ-Container heraus zu verwenden. Aus dem Protokoll geht hervor, dass Sie curl nicht auf dem Rabbit-Container installiert haben. Installieren Sie es also und versuchen Sie es.
Versuchen Sie es dann von außen (von Ihrem Computer aus):
Ordnen Sie einfach die Ports im Rabbit-Container zu: „5672:5672“ und „15672:15672“.
curl localhost:5672 (oder führen Sie Docker Inspection durch und curl direkt zur IP-Adresse des Containers).
Werden die Bilder aus demselben Basisbild erstellt? Vielleicht haben Sie ufw im Rabbit-Bild.
Versuchen Sie auch, ufw auf Ihrem Computer herunterzufahren und zu überprüfen (falls Sie es haben).
Die beste Möglichkeit zur Kommunikation zwischen Containern in Docker-Compose ist die Netzwerkbrücke, Sie werden diese also irgendwann verwenden müssen.