Spring boot microservicio en docker en Oracle Cloud no conecta

T

Hola, tengo un microservicio de spring boot en docker (también tengo kafka y elastic), en una instancia de oracle cloud. El caso es que kafka y elastic me funcionan perfectamente y me puedo conectar a su interfaz gráfica a través del navegador con la ip de la instancia, abriendo los puertos. Con el microservicio de spring boot me es imposible, se ejecuta y funciona todo perfectamente por consola pero al intentar conectarme por navegador no aparece nada, como si no existiera. En mi pc sí me funciona bien en docker ¿Alguien sabe a qué se puede deber? ¿Me estoy perdiendo algo y no me entero?

En el application.properties solo tengo asignado el server.port=5111.

El docker file

FROM openjdk:18-jdk-alpine
COPY proyecto-0.0.1-SNAPSHOT.jar ms-twitter.jar
ENTRYPOINT ["java","-jar","/ms-twitter.jar"]

El docker-compose.yml

java:
    container_name: java-microservice
    build:
      context: ./docker/java
      dockerfile: Dockerfile
    image: ms-twitter:latest
    ports:
      - 5111:5111
JuAn4k4

Le has hecho curl desde la consola donde lo levantas ?

Con ese dockerfile poco se puede decir ya que no compilas ni haces nada, solo metes un jar (eso ya está mal de primeras), pero bueno podría llegar a funcionarte depende de lo que haga ese jar

Lo suyo es copiar los sources, compilar en una fase de Docker, copiar lo compilado a otra fase de Docker (desde una imagen más alpine), usar non-root user, y arrancar la app.(pero tú problema no va por aquí)

2 respuestas
T

#2 Vale, gracias, lo estaba haciendo según esto https://www.baeldung.com/dockerizing-spring-boot-application

Al hacer el curl no hace nada, se queda esperando y al final me sale un error: curl (7): Failed to connect "ip"; connection timed out. He hecho curl a kafka y elastic para probar y sí me devuelve un html, pero con el microservicio no...

1 respuesta
JuSt1

Tienes que tener en cuenta el puerto que expones hacia el exterior desde el Docker, luego tienes que habilitar una regla de entrada para ese puerto ya sea bien desde el origen de tu IP o desde internet 0.0.0.0

Una vez tengas esto podrás acceder por la IP pública y con el puerto a través del navegador

1 respuesta
T

#4 Tengo eso hecho, ya te digo que kafka y elastic me funciona pero esto no... En docker he mapeado el puerto 5111 que es el que usa el microservicio, también lo he añadido a la lista de seguridad con una regla de entrada, igual que con todo lo demás.

pineda

#3 ese curl lo has tirado desde el host o desde dentro del contenedor, que es lo que te dice #2

docker exec java-microservice curl localhost:5111
1 respuesta
T

#6 Me da este error OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "curl": executable file not found in $PATH: unknown

1 respuesta
pineda

#7 prueba con wget en vez de curl, que diría que las imagenes openjdk lo traen. Sino prueba a instalarlo dentro del contenedor

T

Ahora me sale este:

Connecting to localhost:5111 (127.0.0.1:5111)
wget: can't connect to remote host (127.0.0.1): Connection refused

1 respuesta
pineda

#9 9021? no era 5111 ?

1 respuesta
T

#10 Sí, es que lo hice con el otro también para probar y lo copié mal, con el 9021 sí funciona, con el 5111 no

1 respuesta
pineda

#11 pues el contenedor no tiene el puerto 5111 levantado. Mira a ver si sobre el 8080 si que esta levantado, y sino lista los puertos que estan escuchando dentro del contenedor

1 respuesta
T

#12
Tengo esto así, en principio está todo bien, ¿no?

Un docker ps

Inspect del contenedor

Puerto abierto

1 respuesta
pineda

#13 si el contenedor no contesta al puerto :5111 , por muchos mapeos de puertos que hagas en docker o en el firewall, no funcionará. Debes comprobar que el contenedor tenga el .jar arrancado (seguro que si, ya que sino hubiera muerto) y que esté escuchando en el puerto correcto

JuSt1

Si no recuerdo mal no se podían bindear puertos por debajo del 8000 en el host (no dentro del contenedor) por motivos de seguridad, creo que viene en el core de Docker

#16 Si, no tendría sentido esa restricción pensandolo bien, tienes razón!

1 respuesta
pineda

#15 para nada. No se si habrá algún puerto prohibido, pero < 8000 ya te digo que no, sin ir más lejos tengo un kong bindeado contra :80 y :443 , o un dns al :53

T

Lo he arreglado y no sé cómo... He quitado algunas dependencias del pom.xml que no estaba usando y ha empezado a funcionar :S

wdaoajw

Tiene toda la pinta de que tienes definido el servicio escuchando únicamente a alguna interfaz dentro del contenedor, y no todos.

Prueba a configurar el server como 0.0.0.0

JuAn4k4

Yo creo que lo que te pasaba es que no te arrancaba el server, spring boot hace magia con las dependencias, se auto configuran cosas si están en el classpath

Usuarios habituales