我正在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配置吗?
答案 0 :(得分:0)
我建议:
docker ps
获取正在运行的容器的名称/ ID docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' BACKEND_CONTAINER_NAME
从主机获取后端容器的IP地址。现在将此IP放在前端应用程序中,它应该能够连接到您的后端。
答案 1 :(得分:0)
终于明白了。实际上,没有问题。当我在docker容器中运行我的前端VueJS应用程序并从浏览器访问它时,HTML和JS文件将下载到我的浏览器机器上,这是我的主机,REST API调用来自主机。因此,从我的主机,解析器容器主机名(后端)未解析。
解决方案是:我需要使用我的主机名和映射端口( localhost:28080 ),而不是使用实际的docker主机名和端口号(后端:8080 )进行REST调用。