通过 docker-compose 连接 2 个 docker-container

通过 docker-compose 连接 2 个 docker-container

我正在尝试将从一个容器部署的Web应用程序连接到部署在另一个容器的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 中的服务名称默认网络连接容器一样。

这不起作用。我还尝试使用“localhost”作为连接主机。

此外,检查容器“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 中容器之间通信的最佳方式是通过网桥,因此最终您必须使用它。

相关内容