【问题标题】:Not able to connect with MySQL server to Spring Application in Docker?无法将 MySQL 服务器连接到 Docker 中的 Spring 应用程序?
【发布时间】:2021-04-12 05:44:42
【问题描述】:

我是 Docker 新手,作为 spring mvc 应用程序 dockerization 的一部分,我无法将我的应用程序连接到 MySQL 服务器

Dockerfile :这是 Spring mvc 应用程序,所以需要将我的战争复制到

 tomcat container
    FROM tomcat:8.0.20-jre8
    COPY /target/CTH.war /usr/local/tomcat/webapps/

docker-compose.yml

  version: '3'
services:
  mysql-standalone:
    image: 'mysql:5.7'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/provision/mysql/init:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD= root
      - MYSQL_USER= root
      - MYSQL_PASSWORD= root
      - MYSQL_DATABASE= CTH
      - MYSQL_DATABASE= CTH_CHAT
    ports:
      - "3307:3306"
  cth-docker-container:
    image: cth-docker-container
    ports:
      - "8082:8082"
    environment:
      CTH_DATASOURCE_DATABASE: CTH
      CTH_DATASOURCE_SERVERNAME: mysql-standalone
      CTH_DATASOURCE_USERNAME: root
      CTH_DATASOURCE_PASSWORD: root
      CTH_DATASOURCE_PORT: 3307

      CTH_CHAT_DATASOURCE_DATABASE: CTH_CHAT
      CTH_CHAT_DATASOURCE_SERVERNAME: mysql-standalone
      CTH_CHAT_DATASOURCE_USERNAME: root
      CTH_CHAT_DATASOURCE_PASSWORD: root
      CTH_CHAT_DATASOURCE_PORT: 3307

    build:
      context: "./"
      dockerfile: "Dockerfile"
    depends_on:
      - mysql-standalone

application.properties :这是 spring mvc 应用程序,应用程序使用 MySQL db 和两个数据库

1st db
dbuser.local=${CTH_DATASOURCE_USERNAME:root}
dbpassword.local=${CTH_DATASOURCE_PASSWORD:root}
dbdatabaseName.local=${CTH_DATASOURCE_DATABASE:CTH}
dbserverName.local=${CTH_DATASOURCE_SERVERNAME:localhost}
dbportNumber.local=${CTH_DATASOURCE_PORT:3306} 

2nd db
dbuser.cth.chat.local=${CTH_CHAT_DATASOURCE_USERNAME:root}
dbpassword.cth.chat.local=${CTH_CHAT_DATASOURCE_PASSWORD:root}
dbdatabaseName.cth.chat.local=${CTH_CHAT_DATASOURCE_USERNAME:CTH_CHAT}
dbserverName.cth.chat.local=${CTH_CHAT_DATASOURCE_SERVERNAME:localhost}
dbportNumber.cth.chat.local=${CTH_CHAT_DATASOURCE_PORT:3306}

我阅读了我创建 dockerfile 和 docker-compose 文件的文章https://medium.com/@asce4s/dockerize-spring-mvc-application-a9ffbd11eadbhttps://github.com/abagayev/docker-bootstrap-collection/tree/master/mysql-few-databases/docker/provision/mysql/init

但是我在执行时遇到了错误 docker-compose -f docker-compose.yml 向上

原因:com.mysql.cj.core.exceptions.CJCommunicationsException:通信链路故障 cth-docker-container_1 | cth-docker-container_1 |最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。 cth-docker-container_1 |在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) cth-docker-container_1 |在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) cth-docker-container_1 |在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) cth-docker-container_1 |在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) cth-docker-container_1 |在 com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54) cth-docker-container_1 |在 com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:93) cth-docker-container_1 |在 com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:133) cth-docker-container_1 |在 com.mysql.cj.core.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:149) cth-docker-container_1 |在 com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:83) cth-docker-container_1 |在 com.mysql.cj.mysqla.MysqlaSession.connect(MysqlaSession.java:122) cth-docker-container_1 |在 com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1754) cth-docker-container_1 |在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1624) cth-docker-container_1 | ...省略了125个常用框架 cth-docker-container_1 |引起:java.net.UnknownHostException:mysql-standalone cth-docker-container_1 |在 java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797) cth-docker-container_1 |在 java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505) cth-docker-container_1 |在 java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364) cth-docker-container_1 |在 java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298) cth-docker-container_1 |在 com.mysql.cj.core.io.StandardSocketFactory.connect(StandardSocketFactory.java:179) cth-docker-container_1 |在 com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:57) cth-docker-container_1 | ...省略了128个常用帧

如果我设置了错误的环境或我的方式不正确,我会卡住并且没有得到您的任何建议,我一定会帮助我 谢谢!

【问题讨论】:

  • 请查看mysql镜像官方文档。你用错了。 MYSQL_USER= root 将与在 db 初始化时创建的默认 root 用户冲突。使用不同的用户名或不创建默认用户(删除用户/密码的环境变量)。检查您的数据库容器日志:我 99.9% 确定 init 进程要么死了,要么无限循环,并且您的数据库没有运行您认为的数据。见this other answer
  • 注意:以上可能不是唯一的问题,但它肯定在你的路上

标签: docker spring-mvc docker-compose application.properties


【解决方案1】:

在阅读了大量文章后,我成功地在 docker 容器中使用 MySQL db 构建了我的应用程序,并在 Mysql 工作台中访问。

这是我的 docker-compose 文件

version: '3'

services:
  app:
    container_name: cth-app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - '8080:8080'
    environment:
      ##db1
      CTH_DATASOURCE_DATABASE: CTH
      CTH_DATASOURCE_HOST: mysqldb
      CTH_DATASOURCE_USERNAME: cth
      CTH_DATASOURCE_PASSWORD: root
      CTH_DATASOURCE_PORT: 3306

      ##db2
      CTH_CHAT_DATASOURCE_DATABASENAME: CTH_CHAT
      CTH_CHAT_DATASOURCE_HOST: mysqldb
      CTH_CHAT_DATASOURCE_USERNAME: cth
      CTH_CHAT_DATASOURCE_PASSWORD: root
      CTH_CHAT_DATASOURCE_PORT: 3306
    depends_on:
      - mysqldb

  mysqldb:
    image: mysql/mysql-server:5.7
    container_name: mysqldb
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ##here i am able to access dump file which I'll create two databases 
      with user created for me.
    volumes:
      - ./docker/provision/mysql/init:/docker-entrypoint-initdb.d
    ports:
      - '3308:3306'
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_USER: cth
        MYSQL_PASSWORD: root

您需要创建转储文件,请参阅文章 [ https://github.com/abagayev/docker-bootstrap-collection/tree/master/mysql-few-databases]

你什么时候docker-compose up -d --build

您的应用程序正在端口 8080 上运行,并且 MySQL DB 在主机内运行

谢谢!

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 2021-06-14
    • 2020-02-18
    • 1970-01-01
    • 2021-08-02
    • 2023-01-26
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多