Andrii
Andrii

Reputation: 21

Cannot connect to Mysql server in docker from another container

I'm sitting now and looking for solution over 6 hours. Please help me. First of all I will try explain my problem. I created MySql database using image (in dcoker), but when I want create another container (Sprig Boot) and connect to the Database I cannot. I tried created only image of MySql and conntect from intellij and everything is correct. Only when I try creat project in container is problem...

My docer-compose

version: '3'
services:
  api:
    build: ./springboot-api-docker
    ports:
    - "9090:9090"
    depends_on:
      - database
  database:
    container_name: 'localhost'
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_PASSWORD: password
      MYSQL_USER: user
      MYSQL_DATABASE: animaldb
    ports:
      - "3307:3306"
    restart: always

application properties

server.port = 9090

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3307/animaldb?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=password

and DocerFile

FROM openjdk:8u201-jdk-alpine3.9
ADD target/springboot-api-docker-0.0.1-SNAPSHOT.jar .
EXPOSE 9090
CMD java -jar springboot-api-docker-0.0.1-SNAPSHOT.jar

It's funny because... first I wantet change name of container "localhost" to another. But when I was changing that I couldn't run Spring Bot Application even from intellij. I created image of MySql in docker and I was trying to conntect in intellij. It was warking but when I want use SpringBoot Application in caontainer then is problem. I didn't find solve for me yet. I will be very thankful for each help.

My errors here.

java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

And all text from console. Maybe you will find it faster.

Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] api_1 | at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275) ~[hibernate-core-5.4.9.Final.jar!/:5.4.9.Final]

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure api_1 | api_1 | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. api_1 |
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_201] api_1 | at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_201] api_1 | at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_201] api_1 | at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_201] api_1 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.NativeSession.connect(NativeSession.java:144) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:850) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | ... 58 common frames omitted api_1 | Caused by: java.net.ConnectException: Connection refused (Connection refused) api_1 | at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_201] api_1 | at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_201] api_1 | at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_201] api_1 | at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_201] api_1 | at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_201] api_1 | at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_201] api_1 | at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ~[mysql-connector-java-8.0.18.jar!/:8.0.18] api_1 | ... 60 common frames omitted

Upvotes: 1

Views: 1364

Answers (2)

Amirreza Naziri
Amirreza Naziri

Reputation: 1

I know it's late after 2 years, but you should create network first and add two containers to the network.

docker network create network name

docker run yourcontainter --net network name

Upvotes: 0

Francisco Pérez
Francisco Pérez

Reputation: 537

It's not good to use localhost as you docker container name.

Change localhost to database like it.

localhost is always your local machine or a local docker, not external resource.

docker-compose

version: '3'
services:
  api:
    build: ./springboot-api-docker
    ports:
    - "9090:9090"
    depends_on:
      - database
    links:
      - database
  database:
    container_name: 'database'
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_PASSWORD: password
      MYSQL_USER: user
      MYSQL_DATABASE: animaldb
    ports:
      - "3307:3306"
    restart: always

application.properties:

server.port = 9090

spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://database: 3306/animaldb?autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=password

Upvotes: 1

Related Questions