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的问题

Docker 容器整合 Spring Boot 应用

Spring Boot,Java,Docker Compose,尝试在两个容器(mysql,my-api)之间建立连接时出现“连接被拒绝”

Spring boot JDBC无法连接到docker容器中的mysql

无法使用 Spring 数据源参数运行 docker 容器

如何使用 AWS Beanstalk 和 Spring Cloud Netflix 在 Docker 容器之间建立连接