Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Falha comunicação Docker aplicação x Docker MySql

Estou com problemas para iniciar minha aplicação no Docker, onde o mesmo não está encontrando o MySQL

Sendo que se eu executo a aplicação local, ele funciona normalmente, segue abaixo print: Aplicação local

Aplicação no Docker: Aplicação DockerSegue código do application.properties:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://root@localhost:3306/alurafood-orders?createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=123456789
spring.jpa.show-sql=true


spring.application.name=orders-ms

Status do MySQL: Status MySQL

5 respostas

Confere se a porta do container do mysql está correta Insira aqui a descrição dessa imagem para ajudar na acessibilidadeMinha aplicação de pedidos roda local assim, porém não funciona quando subo pelo docker Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A porta está a mesma do código:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Pessoal, algum help? Somente com docker-compose vou conseguir realizar?

solução!

Oi pessoal,

Parece ser um problema de comunicação de rede.

  • Se vocês estão tentando rodar um container docker da sua aplicação Spring, mas ela não está encontrando o seu container MySQL... Cada container possui a sua própria rede isolada, se vocês quiserem que mais de um container conversem entre si vão precisar criar uma rede docker e adicionar esses containers a rede. Mas apenas isso não vai funcionar, vocês também vão precisar passar o DNS/IP do container MySQL lá no application.properties, pois apesar de os containers estarem na mesma rede, cada container é como uma maquina separada e cada um tem seu próprio loopback. Será necessário remover o "localhost" e adicionar o DNS/IP do container MySQL, pois "localhost" aponta sempre para o loopback, no caso, para ele próprio. Feito isso, não se esqueça de buildar o projeto novamente e criar uma nova imagem docker com essa nova build.

Exemplos:

// criando uma rede docker
docker network create minha-rede-personalizada

// para criar um container já conectado a rede docker basta usar o seguinte argumento na criação do container:
--network nome-da-minha-rede

// se você quiser, não precisa refazer o container pra conecta-lo a nova rede, dá pra adicionar ele a rede:
docker network connect minha-rede-personalizada nome-do-meu-container

Eu passo o datasource do meu banco de dados assim:

// caso o Spring encontre a variável de ambiente DB_HOST, irá utiliza-la como caminho, caso não encontre irá utilizar localhost
spring.datasource.url=jdbc:mysql://${DB_HOST:localhost}:3306/alurafood-pedidos?createDatabaseIfNotExist=true

No meu caso, essa variável DB_HOST não existe no meu sistema nativo, eu apenas crio ela dentro do container da minha aplicação Spring, então quando eu rodo na minha máquina, o Spring usa localhost, quando eu rodo no container, usa DB_HOST. Quando vou criar o container da minha aplicação Spring passo o seguinte argumento:

-e DB_HOST=DNS-ou-IP-do-meu-container

Se estiver enfrentando erro de testes no build da aplicação após fazer a alteração no application.properties, utilize o mvn clean install -DskipTests para fazer o build

Isso que eu falei foi baseado em vocês estarem rodando containers na máquina de vocês. Se esses containers rodarem na nuvem vou ficar devendo no conhecimento kkkk

Espero que essas dicas ajudem vocês de alguma maneira. Bons estudos!

Legal a explicação do Mateus. Porém, alguma coisa ainda não me funcionou e achei uma solução que talvez seja mais simples se outra pessoa tenha o mesmo problema.

É só mudar o localhost por host.docker.internal em aplication.properties:

spring.datasource.url=jdbc:mysql://host.docker.internal:3306/alurafood-pedidos?createDatabaseIfNotExist=true

Com isso da a possibilidade de acessar a red interna do docker.

Abraços.