[RESOLVIDO] Docker-Compose, Mysql e Spring-Boot: java.net.ConnectException: Connection refused

Criei dois serviços para rodar em containers separados com Docker-compose: uma aplicação spring-boot e um banco de dados.

Quando vou subir as duas aplicações com o comando docker-compose up o mysql não aceita a conexão:

   Caused by: java.net.ConnectException: Connection refused (Connection refused)
web_1  | 	at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_181]
 web_1  | 	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~ 
[na:1.8.0_181]
web_1  | 	at 
java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~ 
[na:1.8.0_181]
web_1  | 	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~ 
[na:1.8.0_181]
web_1  | 	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_181]
web_1  | 	at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_181]
web_1  | 	at 
com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql- 
connector-java-8.0.13.jar!/:8.0.13]
web_1  | 	at 
com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ~ 
[mysql-connector-java-8.0.13.jar!/:8.0.13]
web_1  | 	... 59 common frames omitted
web_1  | 

arquivo docker-compose.yml:

version: "3.5"
 services:
 db:
  image: mysql:latest
  environment:
  - MYSQL_ROOT_PASSWORD=rootpass
  - MYSQL_DATABASE=teste      
  - MYSQL_USER=rafael
  - MYSQL_PASSWORD=password
ports:
  - 3306:3306
web:
image: spring-mysql
depends_on:
  - db
ports:
  - 8080:8080
environment:
  - DATABASE_HOST=db
  - DATABASE_USER=rafael
  - DATABASE_NAME=teste
  - DATABASE_PORT=3306                  

e o arquivo application.properties:

# JPA PROPS
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

spring.datasource.url=jdbc:mysql://db:3306/teste?useSSL=false&serverTimezone=UTC
spring.datasource.username=rafael
spring.datasource.password=password

spring.database.driverClassName =com.mysql.cj.jdbc.Driver

e o Dockerfile

FROM openjdk:8
ADD target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Alguém tem alguma luz?

Eu acho que você vai conseguir essa ajuda mais rapidamente no SO.

valeu, FearX

esta faltando um link no seu docker compose ;

web:
image: spring-mysql
depends_on:
  - db
links:
  - db

Daniel_Dias, alterei conforme vc falou, mas continua dando Connection refused

estranho.

você poderia compartilhar o seu repositório do seu projeto ?

esse driverClassName =com.mysql.cj.jdbc.Driver é o certo ?

sim, segue a url do projeto: https://github.com/RafaelAPNascimento/spring-mysql
tentei adicionar um arquivo binário wai-for-it.sh que faz o docker-compose segurar a aplicação web até o container do mysql terminar de carregar, mas deu o mesmo erro…

beleza, vou rodar aqui .

tb postei no SO:
https://stackoverflow.com/questions/54145220/spring-boot-docker-compose-mysql-connection-refused

1 curtida

Olá amigo, quando sua aplicação vai acessar não encontra, eu criei uma rede para os containers se comunicar e deixei exposta a porta do mysql na rede interna.

version: "3.5"
 services:

  db:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=teste      
      - MYSQL_USER=rafael
      - MYSQL_PASSWORD=password
    networks:
      - net-backend
    expose:
      - "3306"

  web:
  image: spring-mysql
  depends_on:
    - db
  networks:
    - net-backend
  ports:
    - 8080:8080
  environment:
    - DATABASE_HOST=db
    - DATABASE_USER=rafael
    - DATABASE_NAME=teste
    - DATABASE_PORT=3306   

networks:
  net-backend:

legal, Francisco!

E como que eu referencio a URL do banco? Agora o erro mudou

Caused by: java.net.UnknownHostException: db

parece que a imagem do mysql:latest tem problema.

eu utilizei o image: mysql:5.6 e funcionou .

ele vai dar o error :

Caused by: java.net.ConnectException: Connection refused (Connection refused)

mais vai conectar .

o

Como @Daniel_Dias falou, a imagem do mysql:latest parece ter algum problema, então alterei para versão 5.7 e funcionou, adicionei o phpMyAdmin no docker-compose para visualizar o banco de dados criado.

 version: "3"

services:

  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: teste      
      MYSQL_USER: rafael
      MYSQL_PASSWORD: password
    networks:
      - net-backend

  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    restart: always
    networks:
      - net-backend
    ports:
      - 88:80
    environment:
      PMA_HOST: db:3306
      MYSQL_ROOT_PASSWORD: rootpass
  
  web:
    build: .
    restart: always
    depends_on:
      - db
    networks:
      - net-backend
    ports:
      - "8080:8080"
    environment:
      DATABASE_HOST: db
      DATABASE_USER: rafael
      DATABASE_NAME: teste
      DATABASE_PORT: 3306 
    

networks:
  net-backend:

volumes:
  db_data:

Banco de dados criado

phpmyadmin

Saída do Hibernate

Aplicação em execução

app-em-execucao

Obrigado, pessoal, pela ajuda!

Realmente o problema é a versão do MySQL. Usei a 5.6, apareceu um erro no log, mas a aplicação conectou.