Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';我的两个docker容器即使分别响应,也不能通信吗?_Python_Docker_Docker Compose - Fatal编程技术网

Python 为什么可以';我的两个docker容器即使分别响应,也不能通信吗?

Python 为什么可以';我的两个docker容器即使分别响应,也不能通信吗?,python,docker,docker-compose,Python,Docker,Docker Compose,我知道这个问题已经以各种方式被问过了,但到目前为止,所有现有的答案似乎都不起作用,因为它们都引用了我已经在使用的docker compose 我正在尝试启动一个多容器服务(目前在本地)。一个是运行flask并暴露端口5000(在我的docker compose文件中标记为“web_page”)的web前端容器。另一个容器是文本生成模型(在我的docker compose文件中标记为“model”) 这是我的docker-compose.yml文件: version: '3' services:

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

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

这是我的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:5000
0.0.0.0:8080
后,我得到了一个响应,它准确地显示了我期望得到的结果。因此,这两个服务都已启动并在正确的ip/端口上运行和响应。但是,当我在网页上单击“提交”以将请求发送到“模型”时,我得到了一个连接错误,即使我测试了两个ip/端口都有响应

如果我将“model”容器作为独立容器运行,并且只启动web_页面应用程序(不在容器中),它工作正常。当我将两个容器都放入容器中时,web_页面立即给我

requests.exceptions.ConnectionError
在web_page.py中,代码为:

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

当“模型”在容器中运行并映射了端口8080:8080时,这同样可以正常工作。当网页在容器中运行时,由于某种原因它无法到达模型端点。为什么会这样?我如何修复它?

看起来您正在使用tdocker compose启动的默认网络(因此它的名称类似于
)。如果您将请求的基本URL切换到后端docker容器的主机名(因此是model,而不是0.0.0),您的请求应该能够成功。这里的环境变量很好


顺便说一句,如果你不知道你不需要公开后端应用程序,如果你只想让前端应用程序访问它。它们都位于同一个docker网络中,这样他们就可以互相交谈。

看起来你使用的是docker compose启动的默认网络(因此它的名称类似于
)。如果将请求的基本URL切换到后端docker容器的主机名(因此是model而不是0.0.0.0),则请求应该能够成功。这里的环境变量很好


顺便说一句,如果您不知道您不需要公开后端应用程序,如果您只打算让前端应用程序访问它。它们都位于同一个docker网络中,这样它们就可以相互交谈。

其他答案的元素是正确的,但有两点在ot中缺失或假设她的回答没有明确说明

  • 根据docker文档,创建的默认网桥网络不会提供对映像名称的dns解析;只提供对其他容器的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上创建“bot-net”网络之后。我不知道这是必须要做的,也许你也可以在docker compose文件中创建一个非默认网桥网络。但看起来,你不能使用创建的默认网桥网络并解析映像名(根据文档)

  • 我指出的最后一个端点是:

    ''

  • 我想其他答案中也提到了这一点,但他们忽略了包含“http”部分的必要性。文档中也没有显示这一点,在文档中,他们使用图像的名称代替http,就像他们使用的docker示例中的
    postgres://db:5432

    其他答案的要素是正确的,但有几点遗漏或在其他答案中假设,但没有明确说明

  • 根据docker文档,创建的默认网桥网络不会提供对映像名称的dns解析;只提供对其他容器的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上创建“bot-net”网络之后。我不知道这是必须要做的,也许你也可以在docker compose文件中创建一个非默认网桥网络。但看起来,你不能使用创建的默认网桥网络并解析映像名(根据文档)

  • 我指出的最后一个端点是:

    ''

  • 我想其他答案中也提到了这一点,但他们忽略了包含“http”部分的必要性。文档中也没有显示这一点,在文档中,他们使用图像的名称代替http,就像他们使用的docker示例中的
    postgres://db:5432

    使用容器名称而不是
    0.0.0.0
    !使用容器名称而不是
    0.0.0.0
    !好的。我已经尝试了我能想到的每一种排列方式,但都不起作用。根据这个:似乎我应该连接到://:端口。对我来说,这是:“sports\u int\u bot\u api”_model://model:8080",我将模型发布到主机:0.0.0.0:8080。但它没有连接。我希望点击
    model:8080
    可以工作。您可以通过在shell中执行到容器中进行进一步调试,然后查看是否可以卷曲或ping后端,即
    docker exec-it sh
    。这样您就可以删除应用程序登录从等式中选择c,然后验证你是否可以点击另一个docker容器。好的。我已经尝试了我能想到的每一个排列,但它不起作用。根据这个:似乎我应该连接到:/:端口。对我来说,这是:“sports\u int\u bot\u api”_model://model:8080",我在主机0.0.0.0:8080上发布了模型。但它没有连接。我希望点击
    model:8080
    可以工作。您可以通过在