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?
FearX
Janeiro 10, 2019, 3:35pm
#2
Eu acho que você vai conseguir essa ajuda mais rapidamente no SO.
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…
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
Saída do Hibernate
Aplicação em execução
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.