docker - 在 docker-compose 中使用 nginx 托管网页:无法解析主机名
问题描述
我的设置如下:
- 后端:在 5000 端口上运行的 Flask 服务器;在python中实现
- 前端:React 应用程序向后端发送 http 请求
- 两者都是 dockerized 并使用 docker-compose 在同一个节点上运行
我的码头工人撰写文件:
version: "3"
services:
backend:
ports:
- "5000:5000"
image: <backend-image>
frontend:
depends_on:
- backend
ports:
- "80:80"
links:
- "backend:backend-python"
image: <frontend-image>
nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
我从前端发送请求到http://backend-python:5000/<my-endpoint>
. backend-python
在 docker-compose 的前端规范中定义为后端的主机名。当我在docker-compose up
本地运行并localhost
在浏览器中打开时,页面会按预期显示。当我在 Raspberry Pi 3 上运行时,当我在笔记本电脑上本地打开页面时docker-compose up
,前端无法解析。http://backend-python:5000/<my-endpoint>
我还尝试nginx
使用serve
. 这导致与上述相同的行为。
从谷歌搜索来看,在我看来,使用 docker-compose 构建了自己的网络,其中每个容器都可以通过其名称或在links
.
有人知道为什么从其他机器访问页面时无法解析名称吗?
解决方案
前端应用程序在浏览器中运行,当前端应用程序尝试访问 API 时,浏览器会尝试与其通信。
当您使用 nginx 在 docker 中托管前端应用程序时,容器所做的只是为浏览器所需的静态文件提供服务,但不是 nginx 尝试与您的 API 通信。
这就是为什么您的浏览器无法使用容器名称访问您的后端的原因,您需要公开您的 API 并在您的前端应用程序中更改 API/后端 URL 以使用http://localhost:5000
.
推荐阅读
- c# - raycast 用于防止摄像机穿过天花板和地板使玩家卡住 Unity
- jira - 如何使用 Jira Rest API 获取每个测试的前置条件
- javascript - 如何获得品牌属性的价值?
- javascript - 如何从网站 javascript 中获取价值?
- python - 重复高阶函数
- javascript - Angular - 输入预测值调用 api
- javascript - NodeJS:如何使用 Loopback4 建立多对多关系
- windows - 在 Windows 容器模式下的 Windows 10 上,Docker 拉取失败
- reactjs - 警告:无法对未安装的组件执行 React 状态更新......componentWillUnmount 方法
- python - Pandas 只合并 SQLite 数据库中的新数据