docker组件容器间通信

docker组件容器间通信,docker,spring-boot,docker-compose,Docker,Spring Boot,Docker Compose,我目前正在试验基于Spring Boot的微服务,并开始与docker打交道,但我遇到了一个障碍 基本上,我正在尝试将2个小服务容器化:一个spring云配置服务和一个spring云eureka服务(发现服务)。eureka服务从配置服务获取其配置 这两项服务都是独立的项目,具有各自的DockerFile: Dockerfile云配置服务: FROM openjdk:10.0.2-13-jre-sid ENV APP_FILE cloud-config-service.jar ENV APP_H

我目前正在试验基于Spring Boot的微服务,并开始与docker打交道,但我遇到了一个障碍

基本上,我正在尝试将2个小服务容器化:一个spring云配置服务和一个spring云eureka服务(发现服务)。eureka服务从配置服务获取其配置

这两项服务都是独立的项目,具有各自的DockerFile:

Dockerfile云配置服务:

FROM openjdk:10.0.2-13-jre-sid
ENV APP_FILE cloud-config-service.jar
ENV APP_HOME /usr/apps
EXPOSE 8888
COPY target/$APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
FROM openjdk:10.0.2-13-jre-sid
ENV APP_FILE discovery-service.jar
ENV APP_HOME /usr/apps
EXPOSE 8761
COPY target/$APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
version: '3.7'
services:
  cloud-config-service:
    container_name: cloud-config-service
    build:
      context: cloud-config-service
      dockerfile: Dockerfile-cloud-config-service
    image: cloud-config-service:latest
    ports:
      - 8888:8888
    networks:
      - emp-network

  discovery-service:
    container_name: discovery-service
    build:
      context: discovery-service
      dockerfile: Dockerfile-discovery-service
    image: discovery-service:latest
    ports:
      - 8761:8761
    networks:
      - emp-network
    links:
      - cloud-config-service

networks:
  emp-network:
    driver: bridge
Dockerfile发现服务:

FROM openjdk:10.0.2-13-jre-sid
ENV APP_FILE cloud-config-service.jar
ENV APP_HOME /usr/apps
EXPOSE 8888
COPY target/$APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
FROM openjdk:10.0.2-13-jre-sid
ENV APP_FILE discovery-service.jar
ENV APP_HOME /usr/apps
EXPOSE 8761
COPY target/$APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
version: '3.7'
services:
  cloud-config-service:
    container_name: cloud-config-service
    build:
      context: cloud-config-service
      dockerfile: Dockerfile-cloud-config-service
    image: cloud-config-service:latest
    ports:
      - 8888:8888
    networks:
      - emp-network

  discovery-service:
    container_name: discovery-service
    build:
      context: discovery-service
      dockerfile: Dockerfile-discovery-service
    image: discovery-service:latest
    ports:
      - 8761:8761
    networks:
      - emp-network
    links:
      - cloud-config-service

networks:
  emp-network:
    driver: bridge
使用docker compose,我正试图使用以下docker compose.yml:

FROM openjdk:10.0.2-13-jre-sid
ENV APP_FILE cloud-config-service.jar
ENV APP_HOME /usr/apps
EXPOSE 8888
COPY target/$APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
FROM openjdk:10.0.2-13-jre-sid
ENV APP_FILE discovery-service.jar
ENV APP_HOME /usr/apps
EXPOSE 8761
COPY target/$APP_FILE $APP_HOME/
WORKDIR $APP_HOME
ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
version: '3.7'
services:
  cloud-config-service:
    container_name: cloud-config-service
    build:
      context: cloud-config-service
      dockerfile: Dockerfile-cloud-config-service
    image: cloud-config-service:latest
    ports:
      - 8888:8888
    networks:
      - emp-network

  discovery-service:
    container_name: discovery-service
    build:
      context: discovery-service
      dockerfile: Dockerfile-discovery-service
    image: discovery-service:latest
    ports:
      - 8761:8761
    networks:
      - emp-network
    links:
      - cloud-config-service

networks:
  emp-network:
    driver: bridge
起初,我将发现服务配置为从中获取其配置,但经过一些挖掘后,我发现容器中的localhost引用了容器本身,并且在Docker文档中发现服务可以使用它们的名称相互引用。因此,我更改了发现服务的属性以从中获取其配置。这不起作用,因此这篇文章

这两个DockerFile构建和运行都很好,只是发现服务无法启动配置服务

如果我使用
主机
网络驱动程序和端点,它确实可以工作,但这“感觉”有问题,而不是应该怎么做

我可能遗漏了一些琐碎的东西,但我恐怕找不到什么

编辑: 发现服务控制台日志的小片段:

discovery-service       | 2018-10-02 13:14:26.798  INFO 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://cloud-config-service:8888
cloud-config-service    | 2018-10-02 13:14:26.836  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$8a18e3b3] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
discovery-service       | 2018-10-02 13:14:27.129  INFO 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://cloud-config-service:8888. Will be trying the next url if available
discovery-service       | 2018-10-02 13:14:27.129  WARN 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://cloud-config-service:8888/discovery-service/default": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

听起来你的思路是对的。。。我将引入
依赖的概念,告诉container
发现服务
在启动之前等待container
云配置服务的启动

  discovery-service:
    container_name: discovery-service
    build:
      context: discovery-service
      dockerfile: Dockerfile-discovery-service
    image: discovery-service:latest
    depends_on:
      - cloud-config-service
    ports:
      - 8761:8761
    networks:
      - emp-network
    links:
      - cloud-config-service

启动一个容器需要一段有限的时间,然后它才能主动处理流量,所以关注这个启动序列是很好的,尤其是在处理数据库容器时,其他人应该依赖它,我不能评论,所以我正在写一个新的答案

您是否尝试运行类似于
docker exec-it mycontiner1 curl mycontiner2:port的程序


要查看它是否看到它或ping,如果没有,错误是什么?

首先,docker容器之间的通信是分布式服务中普遍存在的一个更大问题的一个子集-您不知道什么服务(因此)在任何时候都会发生故障,因此在构建应用程序时应该考虑这些故障

您面临的问题是常见的,Docker容器更是如此,我相信容器间通信是Docker中的一个主要部分,Docker正在频繁地进行开发更改

为了解决你的问题,首先,我想提出几点:

  • 容器中的
    localhost
    将引用该容器本身
  • 您计算机上的
    localhost
    实际上指的是您的本地主机,并将通过
    ports
    配置映射到
    docker compose
    文件中的每个服务
  • 依赖于
    只等待容器启动,而不等待实际进程开始运行-这可能意味着您等待的服务不一定已经启动并运行,因此会导致依赖服务超时
  • 您需要的是等待服务开始运行,而不仅仅是容器启动。有两种可能的方法可以实现这一点-

  • 根据故障为您的
    查找服务指定
    重新启动
    策略。在您的情况下,当连接到
    云配置服务时超时将导致失败。类似于
    restart:on failure:10
    的内容,这意味着您要求docker在
    discover服务失败时重新启动该服务,最大重试次数为10次。这样,您就可以为另一个容器(服务)提供合理的启动和运行时间,并确保具有重启策略的容器最终连接到该容器

  • 使用另一个这样的工具,您可以在启动容器之前访问其他服务

  • 另外,为了确保正确地调试问题,请确保检查容器的日志以了解问题的真正原因-
    docker logs-f--tail=100


    希望这能有所帮助。

    谢谢您的回复@scott stensland。不幸的是,不是这样。起初,我在docker-compose.yml中有一个
    依赖于
    ,直到我在链接
    上的docker compose文档中遇到以下段落:“链接也以依赖于的方式表达服务之间的依赖关系,因此它们决定服务启动的顺序。”接下来,我将不再提及网络。。。默认情况下,它将启动一个桥接网络删除网络和.yml中的每一个提及,但不幸的是没有用。谢谢你的评论。事实证明,卷曲配置服务实际上是有效的!我现在开始认为问题在于SpringCloud查询属性文件中指定地址的方式。谢谢您的评论。我将深入探讨启动和依赖顺序。奇怪的是:按照@Niradnik的建议执行
    docker exec curl
    ,实际上会返回正确的配置。我开始认为问题在于SpringCloud查询属性文件中指定的地址的方式。我一直在努力解决类似的问题。MySQL和Spring引导容器之间通过docker compose进行通信。解决方案#1(重启:故障时:10)对我有效。谢谢你@graveti。