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

时间:2018-02-14 05:22:52

标签: node.js docker spring-boot vuejs2 docker-compose

我正在Docker容器中运行SpringBoot应用程序,并使用 docker-compose.yml 在另一个docker容器中运行另一个VueJS应用程序,如下所示:

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

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

我正在尝试使用http://backend:8080/hello从我的VueJS应用程序调用SpringBoot REST API,并且 GET http://backend:8080/hello net :: ERR_NAME_NOT_RESOLVED 失败。

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

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

我的前端/ 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" ]

在我的package.json中,我映射了脚本“start”:“node server.js”,我的 server.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 个答案:

答案 0 :(得分:0)

我建议:

  1. docker ps获取正在运行的容器的名称/ ID
  2. docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' BACKEND_CONTAINER_NAME从主机获取后端容器的IP地址。
  3. 现在将此IP放在前端应用程序中,它应该能够连接到您的后端。

答案 1 :(得分:0)

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

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