【问题标题】:spring boot to mysql docker communcationspring boot 到 mysql docker 通信
【发布时间】:2018-02-07 10:09:27
【问题描述】:

我创建了一个spring boot 应用程序。当我在 Eclipse 中运行应用程序时,我可以从浏览器访问我的服务并获得我想要的响应。

我正在构建这个容器:

FROM java:8-jre
VOLUME /tmp
RUN mkdir -p /conf
COPY application.properties /conf/application.properties
ADD target/chrisbolton_service-1.0.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar","--spring.config.location=file:/conf/application.properties"]

我正在使用这个来启动我的spring boot 应用程序

docker run -it --name chrisbolton_service --link chrisbolton:mysql -p 8080:8080 chrisbolton_service

另外,我有 mysql 正在运行。从docker ps可以看到,

bcb0a900b693 mysql:latest "docker-entrypoint..." 6 hours ago Up 3 hours 0.0.0.0:3306->3306/tcp chrisbolton

我有 read 我需要链接我的容器。但是,当我到达终点localhost:8080/blogs 时,我得到了

2017-08-29 20:20:37.516 ERROR 1 --- [nio-8080-exec-1] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

更新:

根据 cmets 中的建议,我创建了一个 docker network,并在网络中同时运行 mysql 和我的 spring boot 应用程序。仍然出现与上述相同的错误。

这是我的inspectdocker network

$ docker network inspect chrisbolton [ { "Name": "chrisbolton", "Id": "394e6e207ab53967f6f15e9498c95e5b25f3827ad865cc3c21873c7de2e25465", "Created": "2017-08-29T20:37:11.136108745Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "1556dae62334250b20220b05dc18365d65e498c66a47d0db4b8e7e61de8d3496": { "Name": "chrisbolton_service", "EndpointID": "4ce1a129277a0c27b07be796c4b2fa18604f19764e28124729af2479da0cd58c", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, "6d7faf5f43722667bdd9080a41f56d9934574900aec1be96118d9683b99f846e": { "Name": "chrisbolton", "EndpointID": "312b00c24979fdf5bad50377cf64eeec29bbdcbbf5221b981693886ae53ef490", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]

【问题讨论】:

  • 我建议使用 docker 网络而不是链接。链接被视为已弃用。
  • 那么这是创建一个网络然后在同一个网络上运行两个容器吗?
  • 没错。鉴于上述编辑,您的 Spring Boot 应用程序试图连接到 mysql 的是什么?您使用的主机名/IP 是什么?
  • mysql 实例正在localhost:3306 上运行。我正在尝试连接和查询表。所以在我的弹簧属性中,我连接到localhost:3306/chrisbolton。在我将其容器化之前,这是可行的。

标签: java mysql docker spring-boot


【解决方案1】:

每个容器都在自己的网络命名空间中运行。容器中的 localhost 与主机上的 localhost 不同。将容器连接到容器:

  1. 创建一个公共网络,例如docker network create myapp
  2. 使用名称创建容器并连接到网络,例如:docker run --network myapp --name mysql mysql 用于数据库。请注意,无需在主机上发布端口或在 Dockerfile 中公开端口即可使容器到容器网络正常工作。
  3. 服务(数据库、网络服务器等)必须监听所有接口,而不是本地主机。其语法为 0.0.0.0,表示您想监听所有接口。
  4. 在您的应用程序中,使用 docker 的内置 DNS 连接到您的其他容器的名称,例如mysql:3306。不要连接到 localhost(它不起作用)或发布的端口(你直接与容器对话)。

【讨论】:

  • 如何让服务监听所有接口?
  • @ChrisBolton 您告诉应用程序在0.0.0.0 而不是localhost127.0.0.1 上进行侦听。上面的答案涵盖了必要的 docker 步骤。您可以在 docker 中运行无数应用程序,每个应用程序都有不同的配置文件、cli 选项、环境变量或其他配置方式。
  • 我现在明白了。谢谢!
猜你喜欢
  • 2021-01-14
  • 2020-07-12
  • 2019-10-20
  • 2020-09-03
  • 2022-01-09
  • 1970-01-01
  • 2022-07-12
  • 2019-04-12
  • 2018-11-07
相关资源
最近更新 更多