mysql - 无法将 Spring App docker 容器连接到 MySQL DB docker 容器
问题描述
我很难设置两个容器。一个 MySQL 实例,以及另一个想要与 MySQL 实例通信的 Spring 应用程序(使用 Maven 构建)。
我不确定端口的匹配方式是否有问题,但我创建了一个网络“shape-shop-network”,应用程序“shapeshop”和数据库“shape-shop-db-container”都在该网络上”应该通过彼此交谈。
我的“docker run”都指定了正确的网络。
这些是我采取的步骤:
- 为两个容器创建一个网络“shape-shop-network”。
docker network create shape-shop-network
- 运行 MySQL 容器将端口设置为3306,确保指定“shape-shop-network”
docker run -d -p 3306:3306 --name=shape-shop-db-container --network shape-shop-network --env="MYSQL_ROOT_PASSWORD=root" --env="MYSQL_PASSWORD=root" --env="MYSQL_DATABASE=shapeshop" mysql
...然后添加一些架构和初始数据:
docker exec -i shape-shop-db-container mysql -uroot -proot shapeshop < SCHEMA_AND_INIT_DATA.sql
- 在我的 Spring 应用程序中指定我的应用程序属性
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/shapeshop?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect spring.datasource.username=root spring.datasource.password=root spring.datasource.platform=mysql spring.datasource.initialization-mode=always
- 做一个 Maven 包(创建放在目标中的新 jar 文件)
- 做一个 Docker 构建。我的 Docker 文件如下所示:
FROM openjdk:8-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"] EXPOSE 8080
我运行的命令是
docker build -t shapeshop:1.0 .
然后我像这样运行我的图像(在端口8080上):
docker run -p 8080:8080 shapeshop:1.0 --network shape-shop-network
我得到的例外是:
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_212]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_212]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_212]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_212]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.NativeSession.connect(NativeSession.java:152) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
... 103 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_212]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_212]
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) ~[mysql-connector-java-8.0.16.jar!/:8.0.16]
奇怪的是,我可以通过我的 IDE (IntelliJ) 运行我的应用程序,它可以正确连接到容器。
我的 IDE 设置如下所示:
解决方案
推荐阅读
- php - 将 Composer 客户端库添加到 PHP 容器
- reactjs - TypeScript 没有选择重载
- excel - Excel Solver - 限制变量数
- blazor-webassembly - 带有 Enter 按钮的 Blazor InputText 触发函数
- python-3.x - 如何在类中使用 Python 的 websockets 和 asyncio 以及现有的事件循环
- matlab - Matlab:如何将“日期时间”数据导出到外部文件?“使用 fprintf 时出错。没有为‘单元’输入定义函数。”
- oracle - 如何在 SQL plus 中的列值之前修剪尾随空格
- amazon-web-services - 挂载S3桶系统后目录日期显示为1970
- angular - Angular 应用程序在更改时停止重新加载
- javascript - 使用 Javascript 在另一个选项卡或窗口中提交表单