java - spring boot 到 mysql docker 通信

标签 java mysql docker spring-boot

我已经创建了一个 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 小时前 Up 3 小时 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

更新:

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

这是我在 docker network 上的inspect

$ docker network inspect chrisbolton [ { "姓名": "克里斯伯顿", “编号”:“394e6e207ab53967f6f15e9498c95e5b25f3827ad865cc3c21873c7de2e25465”, “创建”:“2017-08-29T20:37:11.136108745Z”, “范围”:“本地”, “司机”:“桥梁”, “启用IPv6”:假的, “IPAM”:{ “司机”:“默认”, “选项”: {}, “配置”:[ { “子网”:“172.18.0.0/16”, “网关”:“172.18.0.1” } ] }, “内部”:假的, “可附加”:假, “入口”:假的, “配置来源”:{ “网络”: ”” }, “仅配置”:假, “容器”:{ “1556dae62334250b20220b05dc18365d65e498c66a47d0db4b8e7e61de8d3496”:{ “名称”:“chrisbolton_service”, “端点 ID”:“4ce1a129277a0c27b07be796c4b2fa18604f19764e28124729af2479da0cd58c”, "MacAddress": "02:42:ac:12:00:03", "IPv4地址": "172.18.0.3/16", “IPv6地址”:“” }, “6d7faf5f43722667bdd9080a41f56d9934574900aec1be96118d9683b99f846e”:{ "姓名": "克里斯伯顿", “端点 ID”:“312b00c24979fdf5bad50377cf64eeec29bbdcbbf5221b981693886ae53ef490”, "MacAddress": "02:42:ac:12:00:02", "IPv4地址": "172.18.0.2/16", “IPv6地址”:“” } }, “选项”: {}, “标签”: {} } ]

最佳答案

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

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

关于java - spring boot 到 mysql docker 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45947796/

相关文章:

mysql - 如何使用另一个唯一列获取列数?

docker - 在 docker 容器中运行 ROS,并从同一 docker 网络(非主机网络)内的另一个 docker 容器运行 echo/pub

c# - 将 docker 容器端口暴露给其他机器

java - 字符串计数的优雅解决方案?

java - Java 8 流的不干扰要求

java - 如何使用 Java 中的 xslt 从纯文本中读取所有数据?

java - 哪个库更适合更快的 Java 应用程序 swt 或 swing?

mysql - 使用 mysql 8 SHA2 对 dovecot 密码进​​行哈希处理

mysql - R中的多个数据库连接

node.js - Docker MongoDB收到元数据后立即关闭连接