首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Docker部署Spring和MySQL应用失败

使用Docker部署Spring和MySQL应用失败
EN

Stack Overflow用户
提问于 2019-12-31 02:55:09
回答 2查看 82关注 0票数 2

我正在尝试将Spring服务器连接到Mysql数据库,两者都运行在不同的容器中,我得到了这个错误:

代码语言:javascript
复制
Caused by: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the main URL sections.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_232]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_232]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_232]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_232]
        at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrlParser.parseConnectionString(ConnectionUrlParser.java:162) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrlParser.<init>(ConnectionUrlParser.java:136) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrlParser.parseConnectionString(ConnectionUrlParser.java:118) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.conf.ConnectionUrl.getConnectionUrlInstance(ConnectionUrl.java:197) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:196) ~[mysql-connector-java-8.0.17.jar!/:8.0.17]
        ... 53 common frames omitted

对于Mysql容器,我使用来自dockerhub的最新镜像。我猜我尝试连接的mysql容器的ip地址是错误的,但我不知道如何获得正确的地址。

我通过以下方式启动mysql容器:

代码语言:javascript
复制
docker run -p 3036:3036 --name mysql-container -d mysql

Spring项目中的application.properties:

代码语言:javascript
复制
database.ip = ${MYSQL_IP:mysql-container}
database.port = ${MYSQL_PORT:3306}
spring.datasource.url = jdbc:mysql://${database.ip}:${database.port}/${database.name}

后端容器:

代码语言:javascript
复制
docker run -p 8080:8080 --name backend_container --link mysql-container:mysql -d backend_container

我直到现在才使用Docker,所以如果这是一个琐碎/无聊的问题,我很抱歉。

如果能帮上忙,我会很感激!:)

EN

回答 2

Stack Overflow用户

发布于 2019-12-31 13:54:52

首先,我不明白为什么数据库是容器化的。一般来说,这是没有理由的。

检查您的数据库主机是否具有端口转发功能,即数据库主机上的端口3036应映射到URL或全局IP地址。查看ngrok,这样你就可以解锁了,但有一种“适当”的方法可以做到这一点,这通常是特定于您的云提供商的。

编辑:您发布的代码中也有一个拼写错误。您的docker run命令使用端口3036,但是您的Spring代码包含database.port = ${MYSQL_PORT:3306}。我不知道这只是一个拼写错误,还是在你的实际代码中,但这也可能是存在的。

票数 0
EN

Stack Overflow用户

发布于 2020-01-10 02:15:57

正如我所发现的,问题是这两个容器不在同一个docker网络上。

当我使用docker-compose.yml通过docker-compose启动它们时,这两个容器是在相同的默认网络上启动的,因此spring容器可以连接到mysql容器ip地址。

docker-compose.yml:

代码语言:javascript
复制
version: '3'

services: 
  mysql-container:
    container_name: mysql-container
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=db_name
      - MYSQL_PASSWORD=root
  spring_app_container:
    container_name: spring_app_container
    image: spring_app
    depends_on:
      - mysql-container
    ports:
      - 8085:8085
      - 8080:8080
    environment:
      - DATABASE_HOST=mysql-container
      - DATABASE_USER=root
      - DATABASE_PASSWORD=password
      - DATABASE_NAME=db_name
      - DATABASE_PORT=3306
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59535599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档