Python 为什么可以';我的两个docker容器即使分别响应,也不能通信吗?
我知道这个问题已经以各种方式被问过了,但到目前为止,所有现有的答案似乎都不起作用,因为它们都引用了我已经在使用的docker compose 我正在尝试启动一个多容器服务(目前在本地)。一个是运行flask并暴露端口5000(在我的docker compose文件中标记为“web_page”)的web前端容器。另一个容器是文本生成模型(在我的docker compose文件中标记为“model”) 这是我的docker-compose.yml文件: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:
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中缺失或假设她的回答没有明确说明
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文件中创建一个非默认网桥网络。但看起来,你不能使用创建的默认网桥网络并解析映像名(根据文档)
postgres://db:5432
其他答案的要素是正确的,但有几点遗漏或在其他答案中假设,但没有明确说明
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文件中创建一个非默认网桥网络。但看起来,你不能使用创建的默认网桥网络并解析映像名(根据文档)
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
可以工作。您可以通过在