英文:
Docker compose connection between java and mysql container not possible
问题
我有一个 Java Spring / Hibernate 应用程序,我无法在 MySQL 和 Java 容器之间创建连接。当我只启动 MySQL 容器并在 CMD 中手动运行 Java 应用程序时,它可以正常运行。但是一旦 Java 应用程序在容器中运行,我就会遇到以下问题:
bookAPI | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
bookAPI |
bookAPI | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
bookAPI | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
bookAPI | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
如果我正确理解错误信息,Java 容器可以向 MySQL 容器发送请求,但反过来不行。我已经将 Java 容器链接到了 MySQL 容器。是否有人知道如何正确地连接这些容器?
我的 docker-compose.yml 如下:
version: '3'
services:
db:
image: mysql:5.7
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: aaaaaa
MYSQL_DATABASE: bookAPI
MYSQL_USER: aaaaaa
MYSQL_PASSWORD: aaaaaa
ports:
- 3306:3306
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
links:
- db
environment:
PMA_HOST: db
PMA_PORT: 3306
PMA_ARBITRARY: 1
restart: always
ports:
- 8081:80
java:
container_name: bookAPI
image: openjdk:8
depends_on:
- db
volumes:
- ./:/app
working_dir: /app
command: bash -c "cd /app && java -jar bookAPI.jar"
stdin_open: true
tty: true
ports:
- 8080:8080
links:
- db
英文:
I have an java spring / hibernate application and I cant create a connection beween the mysql and java containers. When I start just the mysql Container and run the java application manualy in CMD it works fine. But once the java application runs in a container I get the following problem:
bookAPI | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
bookAPI |
bookAPI | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
bookAPI | at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
bookAPI | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.21.jar!/:8.0.21]
If I understand the error correctly the java container can send to the mysql container but not the other way around. I have linked the java container to the mysql container. Anyone knows how to connect these containers correctly?
My docker-compose.yml looks like this:
version: '3'
services:
db:
image: mysql:5.7
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: aaaaaa
MYSQL_DATABASE: bookAPI
MYSQL_USER: aaaaaa
MYSQL_PASSWORD: aaaaaa
ports:
- 3306:3306
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
links:
- db
environment:
PMA_HOST: db
PMA_PORT: 3306
PMA_ARBITRARY: 1
restart: always
ports:
- 8081:80
java:
container_name: bookAPI
image: openjdk:8
depends_on:
- db
volumes:
- ./:/app
working_dir: /app
command: bash -c "cd /app && java -jar bookAPI.jar"
stdin_open: true
tty: true
ports:
- 8080:8080
links:
- db
答案1
得分: 3
你还可以直接通过 docker-compose 的环境变量来覆盖 applications.properties 文件,如下所示:
java:
container_name: bookAPI
image: openjdk:8
volumes:
- ./:/app
working_dir: /app
command: bash -c "cd /app && java -jar bookAPI.jar"
stdin_open: true
tty: true
environment:
spring.datasource.url="jdbc:mysql://db:3306/bookAPI"
links:
- db
ports:
- 8080:8080
我建议您使用 depends_on db 而不是 links:
depends_on:
- db
英文:
You can also directly override the applications.properties with docker-compose environment variables like this :
java:
container_name: bookAPI
image: openjdk:8
volumes:
- ./:/app
working_dir: /app
command: bash -c "cd /app && java -jar bookAPI.jar"
stdin_open: true
tty: true
environment:
spring.datasource.url="jdbc:mysql://db:3306/bookAPI""
links:
- db
ports:
- 8080:8080
I would recomment you tu use depends_on db instead of links
depends_on:
- db
</details>
# 答案2
**得分**: 1
好的,我已经解决了这个问题。要将Spring应用程序与另一个Docker容器连接起来,您需要将application.properties文件中的url值从localhost或IP更改为Docker MySQL容器的名称。当在本地运行或运行maven install时,这可能会有些棘手,所以最佳做法是在容器中启动应用程序时进行覆盖。
```yaml
java:
container_name: bookAPI
image: openjdk:8
volumes:
- ./:/app
working_dir: /app
command: bash -c "cd /app && java -jar bookAPI.jar --spring.datasource.url='jdbc:mysql://db:3306/bookAPI'"
stdin_open: true
tty: true
links:
- db
ports:
- 8080:8080
英文:
Okay, I solved the problem. To connect the spring application with another docker container you need to change the application.properties url value from localhost or ip to the docker maysql container name. Thats tricky while running it localy or run maven install so the best pracice is to overwrite it while starting the application in container.
java:
container_name: bookAPI
image: openjdk:8
volumes:
- ./:/app
working_dir: /app
command: bash -c "cd /app && java -jar bookAPI.jar --spring.datasource.url="jdbc:mysql://db:3306/bookAPI""
stdin_open: true
tty: true
links:
- db
ports:
- 8080:8080
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论