【问题标题】:Docker from a container calls to another container (Connection Refused)Docker 从一个容器调用另一个容器(连接被拒绝)
【发布时间】:2018-12-25 06:56:14
【问题描述】:

我有两个 NodeJS 服务的容器和一个用于反向代理的 Nginx。

我已经在端口 80 上创建了 NGINX,因此它可以通过我的浏览器上的 localhost 公开访问

我还使用反向代理将代理传递给每个负责的服务。

  location /api/v1/service1/ {
    proxy_pass http://service1:3000/;
  }

  location /api/v1/service2/ {
    proxy_pass http://service2:3000/;
  }

在我的服务1中,有一个axios模块想通过向localhost/api/v1/service2发出请求来调用服务2

但是,它说连接被拒绝。我怀疑服务 1 中的 localhost 是否指的是它的容器,而不是 docker 主机。

version: '3'
services:
  service1:
    build: './service1'
    networks:
      - backend
  service2:
    build: './service2'
    networks:
      - backend
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - backend

networks:
  backend:
    driver: bridge

即使使用网络后,它仍然显示 ECONNREFUSED。
请帮忙。

【问题讨论】:

  • 如您所见,server1 容器的 localhost 是 server1 容器。您可能需要使该主机名可配置。
  • @DavidMaze 知道怎么做吗?那么,我应该只使用 servicename 吗?我正在尝试连接到 localhost,所以当我更改我的 API 服务时,它会自动更改,而无需将所有 servicename 重命名为 servicename_new
  • 没有尝试连接到localhost(“此容器”),您正在尝试连接到在其他地方运行的服务。如果您的源代码中有硬编码的主机名,您需要使其可配置,很可能通过从环境变量中获取其值。
  • @DavidMaze 你最好发布一个答案,这样我才能接受。

标签: node.js docker networking docker-compose


【解决方案1】:

尝试在您的 docker-compose 文件中为nginx 添加depends_on,如下所示:

version: '3'
services:
  service1:
    build: './service1'
    expose:
      - "3000"
    networks:
      - backend
  service2:
    build: './service2'
    expose:
      - "3000"
    networks:
      - backend
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - backend
    depends_on:
      - service1
      - service2

networks:
  backend:
    driver: bridge

这将确保两个服务在 nginx 容器尝试连接它们之前首先运行。可能连接被拒绝是因为 nginx 容器在执行其 conf 文件并连接到后端时没有发现两个正在运行的服务而不断崩溃。

【讨论】:

  • 感谢您的回答。无论如何,这不是我的问题。两项服务均已启动。我要做的是:一个容器如何引用主主机(通过连接到主主机中的localhost,而不是容器)?
【解决方案2】:

我相信您还需要在每个服务上公开端口 3000。如下:

version: '3'
services:
  service1:
    build: './service1'
    expose:
      - "3000"
    networks:
      - backend
  service2:
    build: './service2'
    expose:
      - "3000"
    networks:
      - backend
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - backend

networks:
  backend:
    driver: bridge

【讨论】:

  • expose: 在使用 Docker 网络的世界中几乎什么都不做。 (它会影响过时的容器间链接和 Docker 选择主机端口的默认发布机制,这两者都不是很有用。)
  • @DavidMaze 你说的非常对。暴露端口并不能解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2019-02-24
  • 2022-01-12
  • 2016-06-20
  • 2017-10-15
相关资源
最近更新 更多