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?

0
K. Siva Prasad Reddy 14 feb. 2018 a las 08:22

2 respuestas

La mejor respuesta

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 .

1
K. Siva Prasad Reddy 7 abr. 2018 a las 14:41

Yo sugeriría:

  1. docker ps para obtener los nombres / ID de contenedores en ejecución
  2. docker 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.

0
hzitoun 14 feb. 2018 a las 08:51