当前位置: 首页 > 知识库问答 >
问题:

Dockerized NodeJS 应用程序无法调用另一个 Dockerized SpringBoot API

鱼宜
2023-03-14

我使用docker compose在docker容器中运行SpringBoot应用程序,在另一个docker集装箱中运行另一个VueJS应用程序。yml如下:

version: '3'
services:
  backend:
    container_name: backend
    build: ./backend
    ports:
      - "28080:8080"

  frontend:
    container_name: frontend
    build: ./frontend
    ports:
      - "5000:80"
    depends_on:
      - backend

我试图调用SpringBoot REST API从我的VueJS应用程序使用超文本传输协议://backend: 8080/hello和它失败GET超文本传输协议://backend: 8080/hello net::ERR_NAME_NOT_RESOLVED。

有趣的是,如果我进入前端容器并ping后端,它可以解析后端主机名,甚至可以使用wget获得响应http://backend:8080/hello.

更有趣的是,我在docker compose中添加了另一个SpringBoot应用程序,我可以从该应用程序中调用它http://backend:8080/hello使用RestTemplate!!

我的前端/Dockerfile:

FROM node:9.3.0-alpine
ADD package.json /tmp/package.json
RUN cd /tmp && yarn install
RUN mkdir -p /usr/src/app && cp -a /tmp/node_modules /usr/src/app
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm run build
ENV PORT=80
EXPOSE 80
CMD [ "npm", "start" ]

在我的包裹里。json我映射了脚本“start”:“node server.js”和我的服务器。js是:

const express = require('express')
const app = express()
const port = process.env.PORT || 3003
const router = express.Router()

app.use(express.static(`${__dirname}/dist`)) // set the static files location for the static html
app.engine('.html', require('ejs').renderFile)
app.set('views', `${__dirname}/dist`)
router.get('/*', (req, res, next) => {
  res.sendFile(`${__dirname}/dist/index.html`)
})
app.use('/', router)
app.listen(port)
console.log('App running on port', port)

为什么它不能从应用程序解析主机名,但可以从终端解析?我是否缺少任何docker或NodeJS配置?

共有2个答案

韦欣德
2023-03-14

我建议:

    < li> docker ps获取正在运行的容器的名称/id < Li > < code > docker inspect-f“{ range . network settings . networks } } { {。IP address } } { { end } } ' back end _ CONTAINER _ NAME 从主机获取后端容器的IP地址。

现在把这个IP放在前端应用程序中,它应该能够连接到您的后端。

惠凯歌
2023-03-14

终于想通了。实际上,没有问题。当我在docker容器中运行我的前端VueJS应用程序并从浏览器访问它时,HTML和JS文件将下载到我的浏览器机器上,这是我的主机,REST API调用从主机开始。因此,从我的主机中,Docker 容器主机名(后端)未解析。

解决方案是:在进行REST调用时,我需要使用我的主机名和映射的端口(localhost:28080),而不是使用实际的docker主机名和端口号(后端:8080)。

 类似资料:
  • 问题内容: 我正在开发一个应用程序和一个小部件,该小部件需要从应用程序获取数据。我使用以下代码在NSUserDefaults上进行读写。而且我还使用了小部件并引用了这篇文章。但是小部件无法从应用程序或NSUserDefaults获取数据。我该如何运作? /////// 问题答案: 要从同一组NSUserDefaults中读取和保存,需要执行以下操作: 在您的主应用程序中,在项目导航器中选择您的项目

  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 服务1: 服务2: 网状物xml: 我无法从servlet1调用一个到另一个servlet2我不知道在sservlet2哪里做错了,我们必须给出名称类或URL模式,请检查servlet 1的代码。

  • 我看了其他问题,但我无法澄清从另一个任务调用一个任务的疑问,我有以下代码: parseJSON是一个任务,当我运行程序时,它什么也不做,甚至不调用任务,这就像Android为了安全而忽略的一样。

  • 我们正在开发一个plone界面来使用来自Web应用程序的REST API服务。用户登录plone并能够访问REST API 问题1)我需要参考哪些Plone编程文档进行设计 查询:2)我需要参考学习的不同技术有哪些 请参阅随附的建议解决方案框图。 .

  • My AndroidManifest.xml 文件 我的Gradle 我尝试清理/重建 gradle 项目、重新启动 Android Studio、使缓存失效和 rebbot ADB 集成(工具 - 有什么想法吗? 附言:在此之前,我更改了应用程序包的名称 P、 Android Studio无法调试其他项目。