我应该在docker compose中运行的react应用程序中使用哪个API URL



所以我在docker compose中运行了以下内容:

version: "3.7"
services:
api:
stdin_open: true
build:
context: ../hikrr_API
dockerfile: Dockerfile
image: hikrr_api
ports:
- "4000:4000"
volumes:
- ../hikrr_API:/usr/src/
gui:
stdin_open: true
build:
context: ../hikrr_GUI
dockerfile: Dockerfile
image: hikrr_gui
ports:
- "3000:3000"
volumes:
- ../hikrr_GUI:/usr/src/

api只是一个express应用程序,gui是一个简单的react应用程序。

从我的简单react应用程序的上下文来看,我想向我的api发出axios请求。

然而,我无法获得正确的URL。

遵循文档(https://docs.docker.com/compose/networking/)我得出结论,axios调用应该是以下

axios({
method: 'GET',
url: 'http://hikrr_api://api:4000',
params: {
search: search,
take: take,
skip: skip
},
cancelToken: new CancelToken(c => {
cancel = c;
})
})

由于映像名为"hikrr_api",因此该服务名为"api",并在端口4000上公开。

但是,在使用浏览器时,请求会失败并出现错误:"错误:getaddrinfo ENOTFOUND hikrr_api">

此请求的卷曲为:

curl 'http://hikrr_api//api:4000?search=&take=50&skip=0' 
-H 'Accept: application/json, text/plain, */*' 
-H 'Referer: http://localhost:3000/' 
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36' 
--compressed

我在这里错过了什么?

React应用程序通常在Web浏览器中运行;它们在Docker中运行而不是,即使它们是从基于容器的应用程序提供的。
+------------------------------------+
|               Browser              |
|   Fetches...and runs it...calling  |
+------------------------------------+
| http://server:3000    | http://server:4000
+------|-----------------------|-----+
|      v         Docker        v     |
|  +-------+              +-------+  |
|  |  gui  |              |  api  |  |
|  +-------+              +-------+  |
+------------------------------------+

由于两个调用都来自Docker之外,因此都需要连接到服务器的DNS名称和两个服务的已发布ports:。如果浏览器和容器在同一主机上运行(并且您没有使用Docker Toolbox或其他基于VM的解决方案(,则可以在此处使用localhost作为服务器的主机名。

你可以想象一个设置,其中一个服务直接调用另一个服务;也许CCD_ 3容器调用CCD_。在这种情况下,您需要Compose服务名称和容器内进程侦听的端口http://api:4000ports:在这里被忽略,并且图像名称不是URL的一部分。您不需要明确设置container_name:hostname:,也不需要将容器分配给非默认的networks:

最新更新