Docker MySQL-无法从Spring Boot应用连接到MySQL数据库

时间:2019-06-04 09:52:04

标签: mysql spring spring-boot docker docker-compose

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

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

为简单起见:

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:

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开头的数据库:

enter image description here

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

现在我已经启动数据库,对于应用程序,这是它的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。

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

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

enter image description here

enter image description here

enter image description here

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

    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

现在我超时了:

enter image description here

您可以看到我收到错误消息。我的设置有什么问题以及如何解决 这个?我的主机异常未知,或者拒绝连接或连接超时。

我尝试过:

注释

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

  • 这里是docker ps -a

enter image description here

@VUSAL ANSWER输出:

enter image description here

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

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

4 个答案:

答案 0 :(得分:3)

尝试以下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:

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

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

答案 1 :(得分:1)

到目前为止,您还没有尝试在同一网络上运行两个容器。

首先,忘记IP地址-一定要避免使用它。

第二,使用相同的docker网络启动两个组合实例。

第三,请勿公开端口-在网桥网络中,所有端口都可以由运行中的容器访问。

  1. 创建全球网络

    docker network create foo
    
  2. 修改两个撰写文件,以使它们使用此网络,而不是各自创建一个:

    version: '3.5'
    services:
    
    ....
    
    networks:
      default:
        external: true
        name: foo
    
  3. 从撰写文件中删除expose指令-在一个网络中,默认情况下,所有端口都公开

  4. 修改连接字符串以使用默认的3306端口而不是3308

  5. 享受

答案 2 :(得分:1)

为了使该服务通过Docker与MySql连接,它必须位于同一网络中,请查看Docker网络

但是为了获得更好的解决方案,我建议您为MySql和Spring boot编写一个docker compose文件,原因是这样做时很容易将其链接起来。不需要任何其他配置。

version: "3"
services:
  mysql-service:
    image: mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=db
      - MYSQL_USER=root
      - MYSQL_PASSWORD=pass
      - MYSQL_ROOT_PASSWORD=pass
  spring-service:
    image: springservce:latest
    ports:
      - "8080:8080"
    depends_on:
      - mysql-service

答案 3 :(得分:0)

在尝试连接到Docker容器之前,应先停止计算机中的mysql,然后转到application.properties并键入:

spring.datasource.url=jdbc:mysql://localhost:3306/NAME_OF_YOUR_DB_HERE?useSSL=false&allowPublicKeyRetrieval=true

关于本地主机,您应该检查mysql容器并选择IP地址并改用它。最有可能是172.17.0.2。如果不起作用,请使用localhost。