透過 docker-compose 連接 2 個 docker-container

透過 docker-compose 連接 2 個 docker-container

我正在嘗試將從一個容器部署的網路應用程式連接到部署在另一個容器的rabbitmq。

透過依賴此 Connecting to RabbitMQ container with docker-compose ,我建立了以下 docker-compose:

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 是網頁應用程式的服務,我在其中規定了以下rabbitmq-properties:

host = broker
port = 15672
login = guest
password = guest

我選擇“broker”作為主機,正如文件中建議使用 docker-compose 中的服務名稱預設網路連接容器一樣。

這不起作用。

此外,檢查容器“rabbit_chat”我在輸出中看到:

  "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"
            }

答案1

嘗試一下網路

services:
  webapp:
    ...
    networks:
    - mynetwork

 broker:
   ...
    networks:
    - mynetwork

networks:
  mynetwork:

這也設定了內部 DNS,因此您實際上可以用作broker主機名稱webapp來引用其他容器。

答案2

從您的評論來看,這看起來像是存取授權問題,而不是 docker 連接埠問題。
首先,嘗試從rabbit-mq容器內部進行curl,從日誌看來您沒有在rabbit容器上安裝curl,因此安裝它並嘗試。
然後嘗試從外部(從您的機器):
只需映射兔子容器中的連接埠:「5672:5672」和「15672:15672」。
curl localhost:5672 (或執行 docker 檢查並直接捲曲到容器 IP 位址)。

這些鏡像是從同一個基礎鏡像建構的嗎?也許你的兔子圖像中有 ufw。
也可以嘗試關閉電腦上的 ufw 並檢查(如果有的話)

docker-compose 中容器之間通訊的最佳方式是透過網橋,因此最終您必須使用它。

相關內容