我已经创建了一个 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地址”:“”
}
},
“选项”: {},
“标签”: {}
}
]
最佳答案
每个容器都在自己的网络命名空间中运行。容器中的本地主机与主机上的本地主机不同。将容器连接到容器:
- 创建一个公共(public)网络,例如
docker network create myapp
- 使用名称创建您的容器并连接到网络,例如:
docker run --network myapp --name mysql mysql
用于数据库。请注意,无需在主机上发布端口或在 Dockerfile 中公开端口即可使容器到容器的网络正常工作。 - 服务(数据库、网络服务器等)必须监听所有接口(interface),而不是本地主机。其语法为
0.0.0.0
,表示您想要监听所有接口(interface)。 - 在您的应用程序中,使用 docker 的内置 DNS 连接到您的其他容器的名称,例如
mysql:3306
。不要连接到本地主机(它不会工作)或发布的端口(你直接与容器对话)。
关于java - spring boot 到 mysql docker 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45947796/