Docker MySQL-无法从Spring Boot应用连接到MySQL数据库 [英] Docker MySQL - can't connect from Spring Boot app to MySQL database

查看:1102
本文介绍了Docker MySQL-无法从Spring Boot应用连接到MySQL数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想做的是,从我的spring-boot应用程序连接到Docker中的mysql数据库.每个都放在自己的容器中.

What I'm trying to do is, connect from my spring-boot app to mysql database in Docker. Each in their own container.

但是我一定有问题,因为我做不到.

But I must be having something wrong because I can't do it.

为简单起见:

application-properties:

application-properties :

# URL for the mysql db
spring.datasource.url=jdbc:mysql://workaround-mysql:3308/workaround?serverTimezone=UTC&max_allowed_packet=15728640
# User name in mysql
spring.datasource.username=springuser
# Password for mysql
spring.datasource.password=admin
#Port at which application runs
server.port=8080

docker-compose for MySQL:

docker-compose for MySQL:

version: '3'
services:
  workaround-mysql:
    container_name: workaround-mysql
    image: mysql
    environment:
      MYSQL_DATABASE: workaround
      MYSQL_USER: springuser
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always

非常简单吧?我以docker-compose up开头的数据库:

So pretty simple right ? Database I start with docker-compose up:

到目前为止,一切似乎都很好.

All seems to be working fine so far.

现在我已经启动数据库,对于应用程序,这是它的docker-compose.yml:

Now that I have db started, to the application, this is its docker-compose.yml:

version: '3'
services:

  workaround:
    restart: always
    # will build ./docker/workaround/Dockerfile
    build: ./docker/workaround
    working_dir: /workaround
    volumes:
      - ./:/workaround
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    command: "mvn clean spring-boot:run"

对于Dockerfile,我使用Linux Alpine和Java.

For its Dockerfile I use Linux Alpine and Java.

FROM alpine:3.9
....add java...
RUN apk update
RUN apk add dos2unix --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/community/ --allow-untrusted
RUN apk add bash
RUN apk add maven

超级简单.现在让我们启动应用程序:

Super simple. Now let's start the application :

未知主机,所以我们先尝试IP:

Unknown host, so let's try the IP then :

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' workaround-mysql

# URL for the mysql db
spring.datasource.url=jdbc:mysql://172.20.0.2:3308/workaround?serverTimezone=UTC&max_allowed_packet=15728640

现在我超时了:

如您所见,我得到了错误.我的设置有什么问题以及如何解决 这?我的主机异常未知,或者拒绝连接或连接超时.

As you can see I get error. What is wrong with my setup and how to fix this? Either I have unknown host exception or Refused to connect or connection timeout.

我尝试过:

  • Using ip of a container in my application.properties, didn't work
  • Different ports for MySQL and application
  • Different images and versions of MySQL
  • Having everything in one docker compose with wait
  • timer for database.
  • Minimal setup with https://github.com/hellokoding/hellokoding-courses/tree/master/docker-examples/dockercompose-springboot-mysql-nginx Also resulted in communication link failure, Site was accessible but I doubt that db was connected properly.

注释:

  • 我在使用端口3308的一台计算机上全部运行,因为我在本地 3306的MySQL数据库.

  • I run this all on one computer I use port 3308 because I have local MySQL db at 3306.

这是docker ps -a

@VUSAL ANSWER输出:

@Vusal ANSWER output :

唯一与答案中的代码不同的是,我确实等待数据库准备就绪30秒

Only thing different from code in answer I did wait for database to be ready 30 seconds

command: /bin/bash -c "sleep 30;mvn clean spring-boot:run;"

推荐答案

尝试以下docker-compose.yml:

version: '3'
services:
  workaround-mysql:
    container_name: workaround-mysql
    image: mysql
    environment:
      MYSQL_DATABASE: workaround
      MYSQL_USER: springuser
      MYSQL_PASSWORD: admin
      MYSQL_ROOT_PASSWORD: admin
      MYSQL_ROOT_HOST: '%'
    ports:
      - "3308:3306"
    restart: always
  workaround:
    depends_on: 
      - workaround-mysql
    restart: always
    # will build ./docker/workaround/Dockerfile
    build: ./docker/workaround
    working_dir: /workaround
    volumes:
      - ./:/workaround
      - ~/.m2:/root/.m2
    expose:
      - "8080"
    command: "mvn clean spring-boot:run"

并更新您的application.properties以使用下一个JDBC连接URL:

And update your application.properties to use the next JDBC connection url:

spring.datasource.url=jdbc:mysql://workaround-mysql:3306/workaround?serverTimezone=UTC&max_allowed_packet=15728640

当两个容器都在同一个docker-compose文件中时,它应该工作,因为docker-compose为容器创建了默认网络,因此它们可以按名称相互解析.

It should work when both containers in the same docker-compose file, because docker-compose creates default network for containers, so they can resolve each other by name.

这篇关于Docker MySQL-无法从Spring Boot应用连接到MySQL数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆