Jack
Jack

Reputation: 1

Docker failed to connect Java 11 app and MySQL 8 database

I have tried at least 20-25 combination on the Dockerfile, docker-compose.yml and application.yml but still get the same error.

I think the problem may be related to Java version, because I use Java 11 and the proper jdk on Dockerfile, but the error still indicates Java8 (maybe JRE related, but not sure).

Here is the error message when I run docker-compose up command:

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
movies-app |    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
movies-app |    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
movies-app |    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
movies-app |    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
movies-app |    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.NativeSession.connect(NativeSession.java:120) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:948) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:818) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    ... 133 common frames omitted
movies-app | Caused by: java.net.ConnectException: Connection refused (Connection refused)
movies-app |    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
movies-app |    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:412) ~[na:na]
movies-app |    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:255) ~[na:na]
movies-app |    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:237) ~[na:na]
movies-app |    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:na]
movies-app |    at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
movies-app |    at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ~[mysql-connector-j-8.0.31.jar!/:8.0.31]
movies-app |    ... 136 common frames omitted
movies-app |
movies-app exited with code 1

And here are:

Dockerfile:

#FROM openjdk:8
FROM maven:3.8.1-openjdk-11
FROM openjdk:11

COPY target/*.jar app.jar
CMD mvn clean install -DskipTests

EXPOSE 8088
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=docker", "app.jar"]

docker-compose.yml:

version: '3.8'

services:
  server:
    container_name: movies-app
    build: .
    restart: always
    ports:
      - "8088:8080"
    networks:
      - app-network

  mysqldb:
    container_name: mysqldb
    image: mysql:8.0.28
    restart: always
    ports:
      - "3307:3306"
    environment:
      MYSQL_DATABASE: moviesdb
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: pass
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - app-network
      
networks:
  app-network:
    driver: bridge

volumes:
  dbdata:
    driver: local

application.yml: here is the db connection details part:

  datasource:
    password: pass
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    # url: jdbc:mysql://localhost:3306/movies-db?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false
    url: jdbc:mysql://mysqldb:3307/moviesdb?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false

So, what is the cause of the problem?

Upvotes: 0

Views: 246

Answers (1)

Jesse
Jesse

Reputation: 11

Are you trying to connect to port 3307 of mysqldb?

Ports defined in docker-compose.yml are only mapped outside of your docker bridge network. Try to connect to 3306.

Your url in application.yaml should be mysqldb:3306.

Upvotes: 1

Related Questions