Docker MySQL-无法从Spring Boot应用连接到MySQL数据库 [英] Docker MySQL - can't connect from Spring Boot app to MySQL database
问题描述
我想做的是,从我的spring-boot应用程序连接到Docker中的mysql数据库.每个都放在自己的容器中.
What I'm trying to do is, connect from my spring-boot app to mysql database in Docker. Each in their own container.
但是我一定有问题,因为我做不到.
But I must be having something wrong because I can't do it.
为简单起见:
application-properties:
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:
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
开头的数据库:
So pretty simple right ? Database I start with docker-compose up
:
到目前为止,一切似乎都很好.
All seems to be working fine so far.
现在我已经启动数据库,对于应用程序,这是它的docker-compose.yml
:
Now that I have db started, to the application, this is its 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.
For its Dockerfile
I use Linux Alpine and 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
超级简单.现在让我们启动应用程序:
Super simple. Now let's start the application :
未知主机,所以我们先尝试IP:
Unknown host, so let's try the IP then :
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
现在我超时了:
如您所见,我得到了错误.我的设置有什么问题以及如何解决 这?我的主机异常未知,或者拒绝连接或连接超时.
As you can see I get error. What is wrong with my setup and how to fix this? Either I have unknown host exception or Refused to connect or connection timeout.
我尝试过:
- 在我的application.properties中使用容器的ip无效
- MySQL和应用程序的不同端口
- MySQL的不同图像和版本
- 将所有内容都包含在一个docker中,并由wait组成
- 数据库计时器.
- 最小设置 https://github.com/hellokoding/hellokoding-courses/tree/master/docker-examples/dockercompose-springboot-mysql-nginx 还导致通信链接失败,该站点可以访问,但是我 怀疑数据库连接正确.
- Using ip of a container in my application.properties, didn't work
- Different ports for MySQL and application
- Different images and versions of MySQL
- Having everything in one docker compose with wait
- timer for database.
- Minimal setup with https://github.com/hellokoding/hellokoding-courses/tree/master/docker-examples/dockercompose-springboot-mysql-nginx Also resulted in communication link failure, Site was accessible but I doubt that db was connected properly.
注释:
-
我在使用端口3308的一台计算机上全部运行,因为我在本地 3306的MySQL数据库.
I run this all on one computer I use port 3308 because I have local MySQL db at 3306.
这是docker ps -a
@VUSAL ANSWER输出:
@Vusal ANSWER output :
唯一与答案中的代码不同的是,我确实等待数据库准备就绪30秒
Only thing different from code in answer I did wait for database to be ready 30 seconds
command: /bin/bash -c "sleep 30;mvn clean spring-boot:run;"
推荐答案
尝试以下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:
And update your application.properties
to use the next JDBC connection url:
spring.datasource.url=jdbc:mysql://workaround-mysql:3306/workaround?serverTimezone=UTC&max_allowed_packet=15728640
当两个容器都在同一个docker-compose文件中时,它应该工作,因为docker-compose为容器创建了默认网络,因此它们可以按名称相互解析.
It should work when both containers in the same docker-compose file, because docker-compose creates default network for containers, so they can resolve each other by name.
这篇关于Docker MySQL-无法从Spring Boot应用连接到MySQL数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!