Tengo una aplicación Spring Boot que se ejecuta dentro de un contenedor Dockers. La aplicación ofrece puntos finales REST, que se pueden llamar correctamente desde la máquina host mediante http: // localhost: 8080 / endpoint . Anteriormente, cuando esta aplicación se ejecutaba en la máquina host y no dentro de Dockers, podía llamar al MariaDB local usando jdbc: mariadb: // localhost: 3308 / fi? User = userName & password = thePassword desde dentro de la aplicación. Ahora que la aplicación se está ejecutando dentro de Dockers, la conexión devuelve el error: "No se pudo conectar a la dirección = (host = localhost) (puerto = 3308) (tipo = maestro): Conexión rechazada (Conexión rechazada)"

El fragmento de código que hace la conexión es el siguiente:

Connection connection = DriverManager.getConnection("jdbc:mariadb://localhost:3308/fi?user=username&password=thePassword");
        Statement stmt = connection.createStatement();
        String query = "";
        ResultSet rs = stmt.executeQuery("SELECT * ....;");

Ya tengo el puerto 8080 publicado para aceptar las llamadas REST de la máquina host, y he tratado de publicar o exponer el puerto 3308 para permitir que se realice la llamada a la base de datos, sin ninguna ayuda.

¡Gracias de antemano!

1
dFrancisco 27 jun. 2017 a las 22:13

2 respuestas

La mejor respuesta

La forma sugerida de usar la base de datos con Docker es ejecutarla en un contenedor separado. Los contenedores Docker se encuentran en la misma red (Docker), por lo que solo necesita vincularlos. Aquí tiene una imagen de MariaDB y pautas sobre cómo usarla. Puede volcar su base de datos existente en su imagen (por lo que no necesita volver a hacerlo todo).

Para hacer eso tienes que:

  1. Crear nueva imagen de base de datos (volcar la base de datos en ella)
  2. Ejecute el contenedor de la base de datos (¡establezca el nombre!)
  3. Ejecute su contenedor REST con link do database container
1
Jan Giacomelli 27 jun. 2017 a las 19:38

Si pretendía hacer solo desarrollo, puede vincular contenedores o mejor, puede usar docker-compose. Pero tenga cuidado: ¡la base de datos en contenedores no es para producción!

Desde el contenedor, puede recuperar la IP del host del acoplador con ip route show

# ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.2

Entonces, la ruta predeterminada es su IP de host (aquí 172.17.0.1)

En este punto, preste atención al firewall del host que puede bloquear la conexión.

En su script de punto de entrada puede recuperar la IP del host con ip route show | awk '/default/ {print $3}'. Luego puede pasar esta IP a través de una variable de entorno y recuperarla en su aplicación.

1
D. Gonçalves 27 jun. 2017 a las 21:22