我知道已经以各种方式提出了这个问题,但是到目前为止,现有的答案似乎都不起作用,因为它们都引用了我已经在使用的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:5000
或0.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在容器中运行时,由于某种原因它无法到达模型端点。为什么会这样,我该如何解决?
答案 0 :(得分:2)
看起来您正在使用由docker-compose旋转的默认网络(因此其名称类似<directory-name_default>
)。如果将请求的基本URL切换为后端docker容器的主机名(因此为模型而不是0.0.0.0),则请求应该能够成功。这里的环境变量很好。
如果您只是不打算让前端应用程序访问后端应用程序,以防您不知道不需要公开后端应用程序。他们俩都坐在同一个docker网络中,因此他们可以彼此交谈。
答案 1 :(得分:0)
其他答案的元素是正确的,但其他答案中有一些遗漏或假定的要点,但并未明确指出。
所以,我最后的撰写文件是:
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文件中创建一个非默认的桥接网络。但是看来,您不能使用创建的默认桥接网络来解析图像名称(根据文档)
我指向的最终端点是:
我想在其他答案中也提到了这一点,但是他们忽略了包括'http'部分的需要。这也未在文档中显示,在文档中他们使用http的图像名称代替了在码头工人示例中使用的postgres://db:5432
https://docs.docker.com/compose/networking/