Verbinden Sie 2 Docker-Container über Docker-Compose

Verbinden Sie 2 Docker-Container über Docker-Compose

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 brokerals 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.

verwandte Informationen