Java Spring 在作为 Docker 容器运行时不会与 Consul 对话
Posted
技术标签:
【中文标题】Java Spring 在作为 Docker 容器运行时不会与 Consul 对话【英文标题】:Java Spring will not talk to Consul when run as a Docker container 【发布时间】:2016-03-30 02:18:53 【问题描述】:我正在尝试解决我认为运行微服务的常见用例。在这种情况下,我正在使用 spring 云应用程序测试 consul。我正在尝试以两种不同的方式测试领事。第一个在 docker 容器中运行,另一个在 docker 主机上运行。然后我尝试启动一个 Spring Cloud 容器,它将与任一 consul 示例进行对话。
当 spring cloud 应用程序作为 docker 容器运行时,我无法让 spring cloud 应用程序与 consul 对话。当 Spring Cloud 应用程序以主机网络模式运行时,它可以解析 localhost 端口,但如果我希望运行图像的多个实例,这不是一个可接受的解决方案。
下面显示了将这两个服务作为容器运行时我的 docker compose 文件的示例。在这里,我试图通过环境变量在 spring cloud 中设置 consul uri,但无法使用各种配置使其工作。如果有人能指出这些功能协同工作的示例,那将非常有帮助。
consul1:
image: progrium/consul
ports:
- "8400:8400"
- "8500:8500"
- "8600:53/udp"
- "8600:53/tcp"
environment:
GOMAXPROCS: 100
entrypoint: "/bin/consul"
hostname: consul
command: agent -log-level=debug -server -config-dir=/config -bootstrap -ui-dir /ui
simpletest:
build: simpletest
hostname: simpletest
environment:
JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n -Dspring.cloud.consul.host=consul1"
ports:
- 39041:7051
- 39052:7055
# d2fdockerroot_consul1_1 consul
# links:
# - consul1
【问题讨论】:
启用links: - consul1
部分后应该可以工作,因为这会导致simpletest 容器的/etc/hosts
中有一个条目,因此它将consul1
主机名解析为consul1 容器的docker-internal ip .你可以单独测试,也许你的 JAVA_OPTS 没有被使用(被某些脚本设置这些参数)?
【参考方案1】:
这里有一个啤酒厂系统示例 - https://github.com/spring-cloud-samples/brewery。其中一个文件是 CONSUL 的 docker-compose 文件。
https://github.com/spring-cloud-samples/brewery/blob/master/docker-compose-CONSUL.yml
查看代码库中的所有 application-consul.yaml
文件,了解如何设置 Spring Boot 应用程序以与 consul 对话。
例如:https://github.com/spring-cloud-samples/brewery/blob/master/aggregating/src/main/resources/application-consul.yaml
如果有任何问题写在这里或去 spring-cloud gitter https://gitter.im/spring-cloud/spring-cloud
【讨论】:
这非常有用。使用它,我可以通过在环境“spring.cloud.consul.host:discovery”下设置来修改我的示例以指定领事网址,这显然对于这个实例来说已经足够了。【参考方案2】:我遇到了完全相同的问题:链接到我的 consul 容器是不够的。但是,以下为我做了:如here所述,对应的consul主机和端口配置需要放在bootstrap.yml
,而不是application.yml
。
spring:
cloud:
consul:
host: consul
port: 8500
与对应的docker-compose.yml
:
version: "2.0"
services:
consul:
image: consul:latest
ports:
- "8500:8500"
my-service:
build: path/to/dockerfile
depends_on:
- consul
links:
- consul:consul
【讨论】:
谢谢!面临同样的问题,添加 bootstrap.yml 解决了我的问题。以上是关于Java Spring 在作为 Docker 容器运行时不会与 Consul 对话的主要内容,如果未能解决你的问题,请参考以下文章
解决spring cloud dubbo用nacos作为注册中心应用部署到docker中IP是容器IP的问题
Spring Boot,Java,Docker Compose,尝试在两个容器(mysql,my-api)之间建立连接时出现“连接被拒绝”