为什么我的两个docker容器即使分别响应也无法通信?

时间:2020-06-08 02:59:50

标签: python docker docker-compose

我知道已经以各种方式提出了这个问题,但是到目前为止,现有的答案似乎都不起作用,因为它们都引用了我已经在使用的docker-compose。

我正在尝试启动多容器服务(目前在本地)。一个是运行烧瓶的Web前端容器并暴露端口5000(在我的docker-compose文件中标记为“ web_page”)。另一个容器是文本生成模型(在我的docker-compose文件中标记为“模型”)。

这是我的docker-compose.yml文件:

version: '3'
services:
  web_page:
    build: ./web_app
    ports:
      - "5000:5000"
  model:
    build: ./gpt-2-cloud-run
    ports:
      - "8080:8080"

运行docker-compose up并使用浏览器(或邮递员)并转到0.0.0.0:50000.0.0.0:8080之后,我得到一个响应,它确切地表明了我希望返回的内容。因此,这两个服务都已启动并且正在运行,并且在正确的ip /端口上响应。但是,当我单击web_page上的“提交”以将请求发送到“模型”时,即使我测试了两个IP /端口都响应,我也会收到连接错误。

如果我将“模型”容器作为独立的容器运行,并且仅在未在容器中启动web_page应用程序的情况下运行良好。当我将两者都放入容器中时,web_page会立即给我

requests.exceptions.ConnectionError

在web_page.py代码中:

requests.post('http://0.0.0.0:8080',json={'length': 100, 'temperature': 0.85,"prefix":question})

与有效负载一起发送到该IP,并返回响应。同样,当“模型”在容器中运行并且映射了端口8080:8080时,此方法工作正常。当web_page在容器中运行时,由于某种原因它无法到达模型端点。为什么会这样,我该如何解决?

2 个答案:

答案 0 :(得分:2)

看起来您正在使用由docker-compose旋转的默认网络(因此其名称类似<directory-name_default>)。如果将请求的基本URL切换为后端docker容器的主机名(因此为模型而不是0.0.0.0),则请求应该能够成功。这里的环境变量很好。

如果您只是不打算让前端应用程序访问后端应用程序,以防您不知道不需要公开后端应用程序。他们俩都坐在同一个docker网络中,因此他们可以彼此交谈。

答案 1 :(得分:0)

其他答案的元素是正确的,但其他答案中有一些遗漏或假定的要点,但并未明确指出。

  1. 根据docker文档,创建的默认网桥网络不会为映像名称提供dns分辨率;仅指向其他容器https://docs.docker.com/network/bridge/#differences-between-user-defined-bridges-and-the-default-bridge
  2. 的IP地址

所以,我最后的撰写文件是:

version: '3'
services:
  web_page:
    build: ./web_app
    ports:
      - "5000:5000"
    networks: 
      - bot-net
    depends_on:
      - model

  model:
    image: sports_int_bot_api_model
    networks: 
      - bot-net

networks:
  bot-net:
    external: true

首先在CLI上创建了一个“僵尸网络”网络。我不知道这一定是必须要做的,也许您也可以在docker-compose文件中创建一个非默认的桥接网络。但是看来,您不能使用创建的默认桥接网络来解析图像名称(根据文档)

  1. 我指向的最终端点是:

    'http://model:8080'

我想在其他答案中也提到了这一点,但是他们忽略了包括'http'部分的需要。这也未在文档中显示,在文档中他们使用http的图像名称代替了在码头工人示例中使用的postgres://db:5432 https://docs.docker.com/compose/networking/