Estoy ejecutando una aplicación SpringBoot en un contenedor acoplable y otra aplicación VueJS en otro contenedor acoplable usando docker-compose.yml de la siguiente manera:
version: '3'
services:
backend:
container_name: backend
build: ./backend
ports:
- "28080:8080"
frontend:
container_name: frontend
build: ./frontend
ports:
- "5000:80"
depends_on:
- backend
Estoy tratando de invocar SpringBoot REST API desde mi aplicación VueJS usando http: // backend: 8080 / hello y está fallando con GET http: // backend: 8080 / hello net :: ERR_NAME_NOT_RESOLVED .
Curiosamente, si entro en el contenedor frontend y hago ping al backend, puedo resolver el nombre de host backend e incluso puedo obtener la respuesta usando wget http: // backend: 8080 / hola.
Aún más interesante, agregué otra aplicación SpringBoot en docker-compose y desde esa aplicación puedo invocar http: // backend: 8080 / hola usando RestTemplate !!
Mi interfaz / 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" ]
En mi package.json mapeé el script "start": "node server.js" y mi server.js es:
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)
¿Por qué no puede resolver el nombre de host desde la aplicación, pero puede resolverlo desde la terminal? ¿Me falta alguna configuración de Docker o NodeJS?
2 respuestas
Finalmente lo descubrí. De hecho, no hay problema. Cuando ejecuto mi aplicación VueJS frontend en el contenedor de la ventana acoplable y accedo a ella desde el navegador, los archivos HTML y JS se descargarán en la máquina de mi navegador, que es mi host, y la llamada a la API REST va desde la máquina host. Entonces, desde mi host, el nombre de host del contenedor de la ventana acoplable ( backend ) no se resuelve.
La solución es: en lugar de usar el nombre de host y el número de puerto de la ventana acoplable real ( backend: 8080 ), necesito usar mi nombre de host y el puerto asignado ( localhost: 28080 ) mientras hago llamadas REST .
Yo sugeriría:
docker ps
para obtener los nombres / ID de contenedores en ejecucióndocker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' BACKEND_CONTAINER_NAME
para obtener la dirección IP del contenedor backend del host.
Ahora coloque esta IP en la aplicación frontal y debería poder conectarse a su backend.
Preguntas relacionadas
Nuevas preguntas
node.js
Node.js es un tiempo de ejecución de E / S asíncrono, sin bloqueo y basado en eventos que utiliza el motor JavaScript V8 de Google y la biblioteca libuv. Se utiliza para desarrollar aplicaciones que hacen un uso intensivo de la capacidad de ejecutar JavaScript tanto en el cliente como en el lado del servidor y, por lo tanto, se benefician de la reutilización del código y la falta de cambio de contexto.