我想做的是,从我的spring-boot应用程序连接到Docker中的mysql数据库。每个都放在自己的容器中。
但是我一定有问题,因为我做不到。
为简单起见:
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:
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
开头的数据库:
到目前为止,一切似乎都很好。
现在我已经启动数据库,对于应用程序,这是它的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。
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
超级简单。现在让我们启动应用程序:
未知主机,所以我们先尝试IP:
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
现在我超时了:
您可以看到我收到错误消息。我的设置有什么问题以及如何解决 这个?我的主机异常未知,或者拒绝连接或连接超时。
我尝试过:
注释:
我在使用端口3308的一台计算机上全部运行,因为我在本地 3306的MySQL数据库。
这里是docker ps -a
@VUSAL ANSWER输出:
唯一与答案中的代码不同的是,我确实等待数据库准备就绪30秒
command: /bin/bash -c "sleep 30;mvn clean spring-boot:run;"
答案 0 :(得分:3)
尝试以下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:
spring.datasource.url=jdbc:mysql://workaround-mysql:3306/workaround?serverTimezone=UTC&max_allowed_packet=15728640
当两个容器都在同一个docker-compose文件中时,它应该工作,因为docker-compose为容器创建了默认网络,因此它们可以按名称相互解析。
答案 1 :(得分:1)
到目前为止,您还没有尝试在同一网络上运行两个容器。
首先,忘记IP地址-一定要避免使用它。
第二,使用相同的docker网络启动两个组合实例。
第三,请勿公开端口-在网桥网络中,所有端口都可以由运行中的容器访问。
创建全球网络
docker network create foo
修改两个撰写文件,以使它们使用此网络,而不是各自创建一个:
version: '3.5'
services:
....
networks:
default:
external: true
name: foo
从撰写文件中删除expose
指令-在一个网络中,默认情况下,所有端口都公开
修改连接字符串以使用默认的3306
端口而不是3308
享受
答案 2 :(得分:1)
为了使该服务通过Docker与MySql连接,它必须位于同一网络中,请查看Docker网络
但是为了获得更好的解决方案,我建议您为MySql和Spring boot编写一个docker compose文件,原因是这样做时很容易将其链接起来。不需要任何其他配置。
version: "3"
services:
mysql-service:
image: mysql
ports:
- "3306:3306"
environment:
- MYSQL_DATABASE=db
- MYSQL_USER=root
- MYSQL_PASSWORD=pass
- MYSQL_ROOT_PASSWORD=pass
spring-service:
image: springservce:latest
ports:
- "8080:8080"
depends_on:
- mysql-service
答案 3 :(得分:0)
在尝试连接到Docker容器之前,应先停止计算机中的mysql,然后转到application.properties并键入:
spring.datasource.url=jdbc:mysql://localhost:3306/NAME_OF_YOUR_DB_HERE?useSSL=false&allowPublicKeyRetrieval=true
关于本地主机,您应该检查mysql容器并选择IP地址并改用它。最有可能是172.17.0.2。如果不起作用,请使用localhost。