【发布时间】:2019-10-19 20:14:03
【问题描述】:
我想要做的是,从我的 spring-boot 应用程序连接到 Docker 中的 mysql 数据库。每个都在自己的容器中。
但我一定是做错了什么,因为我做不到。
为简单起见:
应用程序属性:
# 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
用于 MySQL 的 docker-compose:
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开头:
目前看来一切正常。
现在我已经启动了 db,对于应用程序来说,这是它的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
现在我超时了:
如您所见,我收到错误消息。我的设置有什么问题以及如何解决 这?我有未知的主机异常或拒绝连接或连接超时。
我试过了:
- 在我的 application.properties 中使用容器的 ip,不起作用
- MySQL 和应用程序的不同端口
- 不同镜像和版本的 MySQL
- 将所有内容放在一个 docker 中,等待组合
- 数据库定时器。
- 最小设置 https://github.com/hellokoding/hellokoding-courses/tree/master/docker-examples/dockercompose-springboot-mysql-nginx 也导致通信链路故障,站点可以访问,但我 怀疑 db 是否连接正确。
注意事项:
我在一台计算机上运行这一切我使用端口 3308,因为我有本地 MySQL 数据库位于 3306。
这里是
docker ps -a
@Vusal ANSWER 输出:
唯一与答案中的代码不同的是,我确实等待数据库准备好 30 秒
command: /bin/bash -c "sleep 30;mvn clean spring-boot:run;"
【问题讨论】:
-
容器之间不使用 docker 网络有什么原因吗?
-
@ChristianW。我对他们了解不多,我试图把东西放到同一个网络中。但我仍然没有任何成功。使用 NETWORK : WORKAROUND 对两者都进行了定义。 (也许我没有正确地做某事)
-
这些东西应该在一个 docker compose 中,否则它不会工作。
-
@M.Deinum 在我的一次尝试中,我已经这样做了,我目前正在再次这样做以确保我没有搞砸,从下面的答案:)
-
@M.Deinum 仍然出现错误连接被拒绝,即使他们在同一个网络上
标签: mysql spring spring-boot docker docker-compose