gpt4 book ai didi

docker-compose 容器间通信

转载 作者:行者123 更新时间:2023-12-02 17:53:32 47 4
gpt4 key购买 nike

我目前正在试验基于 Spring Boot 的微服务并开始使用 docker,但我遇到了障碍。

基本上我想要做的是容器化 2 个小服务:一个 spring 云配置服务和一个 spring 云 Eureka 服务(发现服务)。 eureka 服务从配置服务中获取其配置。

这两个服务都是具有自己的 Dockerfile 的独立项目:

Dockerfile-cloud-config-service:

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"]

Dockerfile-发现-服务:
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"]

使用 docker-compose 我试图使用以下 将它们联系在一起docker-compose.yml:
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

起初,我配置了发现服务以从 http://localhost:8888 获取其配置。 ,但经过一番挖掘,我发现容器中的 localhost 指的是容器本身,并且在 Docker 文档中发现服务可以使用它们的名称相互引用。因此,我更改了发现服务的属性以从 http://cloud-config-service:8888 获取其配置.这不起作用,因此这篇文章。

两个 Dockerfiles 构建和运行都很好,除了发现服务无法在 http://cloud-config-service:8888 上获取配置服务的事实。 .

如果我使用 host 确实有效网络驱动程序和 http://localhost:8888端点,但这“感觉”很古怪,而不是应该如何完成。

我可能遗漏了一些微不足道的东西,但恐怕我找不到什么。

编辑:
发现服务控制台日志的一小段:
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)

最佳答案

首先,docker 容器之间的通信是分布式服务中普遍存在的一个更大问题的一个子集 - 您不知道什么服务(因此 their dependencies )会在任何时候停止运行,因此您应该在以下情况下考虑此类故障你构建你的应用程序。

您面临的问题很常见,对于 Docker 容器更是如此,我相信容器间通信是 Docker 中经常发生变化的主要部分。

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

  • localhost from 在容器内将指的是该容器本身。
  • localhost在您的机器上实际上是指您的本地主机,并将与您通过 ports 映射的服务进行映射。 docker-compose 中每个服务的配置文件。
  • depends_on只等待容器启动,而不等待实际进程开始运行——这可能意味着您正在等待的服务不一定启动并运行,因此,导致依赖服务超时。

  • 您需要的是等待服务开始运行,而不仅仅是容器启动。有两种可能的方法可以做到这一点 -
  • 指定一个 restart您的政策 discovery-service基于失败。在您的情况下,连接到 cloud-config-service 时超时将导致失败。 .类似 restart: on-failure:10这意味着您要求 docker 重新启动 discover-service当它以最大 10 次重试失败时。这样,您就可以为另一个容器(服务)提供合理的时间启动并运行,并确保具有重新启动策略的容器最终连接到该容器。
  • 使用其他工具,如 dockerize允许您wait在启动容器之前在其他服务上。

  • 此外,为了确保您正确调试问题,请务必检查容器的日志以了解问题的真正原因 - docker logs -f --tail=100 <container_name/container_id> .

    希望这可以帮助。

    关于docker-compose 容器间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52608571/

    47 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com