Свойства весеннего облака не извлекаются при использовании docker-compose

Я столкнулся со странной проблемой, я создаю DockerFile для каждой из моих служб (spring-cloud, eureka, my-service), поэтому, когда я запускаю компоновку докеров, запускается облачный сервер spring, запускается eureka, но мое приложение не смог получить конфигурацию из весеннего облака, но когда я получаю доступ к URL-адресу, который появляется в журнале, он работает, у меня нет идей о том, как решить эту проблему.

Подпишитесь на мои DockerFiles: Весеннее облако Docker-файл

FROM openjdk:11.0.2-jre-stretch

RUN ["mkdir", "/root/remote-config-service"]
COPY target/remote-config-service-0.0.1-SNAPSHOT.jar /root/remote-config-service/

ENTRYPOINT java -jar /root/remote-config-service/remote-config-service-0.0.1-SNAPSHOT.jar

EXPOSE 9000 9001

Эврика Docker-файл:

FROM openjdk:11.0.2-jre-stretch

RUN ["mkdir", "/root/eureka-service-discovery"]
COPY target/eureka-service-discovery-0.0.1-SNAPSHOT.jar /root/eureka-service-discovery/

ENTRYPOINT java -jar /root/eureka-service-discovery/eureka-service-discovery-0.0.1-SNAPSHOT.jar

EXPOSE 8761

мой файл приложения Docker:

FROM openjdk:11.0.2-jre-stretch

ENV PROFILE = "dev"

ADD ["target/product-api-0.0.1-SNAPSHOT.jar", "product-api-0.0.1-SNAPSHOT.jar"]
EXPOSE 18100 8091
RUN sh -c 'touch /product-api-0.0.1-SNAPSHOT.jar'

ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=$PROFILE -jar /product-api-0.0.1-SNAPSHOT.jar" ]


HEALTHCHECK --interval=5m --timeout=3s \
    CMD curl -f http://localhost:8091/actuator/health || exit 1

Докер сочиняет

  remote-config-service:
    container_name: remote-config-service
    build: ./remote-config-service
    ports:
      - 9000:9000
      - 9001:9001
    depends_on:
      - mysqldb

  eureka-service-discovery:
    build: ./eureka-service-discovery
    container_name: eureka-service-discovery
    hostname: localhost
    restart: on-failure
    ports:
      - 8761:8761

  product-api:
    container_name: product-api
    build: ./product-api
    ports:
      - 18000:18000
      - 8091:8091
    depends_on:
      - eureka-service-discovery
      - remote-config-service
      - mysqldb
    restart: on-failure

когда я пытаюсь запустить свое приложение (продукт-api), я сталкиваюсь с этой ошибкой:

c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://localhost:9000
c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://localhost:9000. Will be trying the next url if available
c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:9000/product-api/dev": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

но когда я получаю доступ к этому URL-адресу в своем браузере:

http://localhost:9000/product-api/dev

это работает нормально.

Есть ли у кого-нибудь идея помочь мне с этой проблемой?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
346
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Контейнеры Docker по умолчанию не могут взаимодействовать друг с другом через локальный хост, они изолированы друг от друга с точки зрения сети. Вот почему вы можете перейти на localhost: 9000 в своем браузере, но контейнер не может добраться до него. Локальный хост в вашем контейнере — это петлевой адрес только для этого контейнера, а не для хоста. Существует несколько различных типов сетей (см. https://docs.docker.com/network/), но тип по умолчанию — bridge. Сеть моста изолирует ваш контейнер от других сетей контейнеров на вашем хосте, а затем перенаправляет трафик на один из портов вашего хоста в порт контейнера (определяется записью port: <host>:<container>). Существует несколько вариантов, позволяющих контейнерам взаимодействовать друг с другом:

  • Бегайте с network: host (не рекомендуется). Это запустит ваши контейнеры непосредственно в вашей хост-сети, чтобы все они могли общаться друг с другом через локальный хост. Вы можете избавиться от настройки port:, если используете это. Контейнер будет связывать любые порты, используемые службой, непосредственно с хостом (это также может привести к конфликтам портов, если вы хотите запустить несколько контейнеров, использующих один и тот же порт).
  • Использовать ссылки (устарело)
  • Использовать пользовательские сети https://docs.docker.com/compose/networking/ (рекомендуется)
    бывший докер-compose.yml:

    version: '3'
    services: 
      service1:
        container_name: service1
        build: .
        networks:
          - servicenet
        ports:
          - 8888:9000
    
      service2:
        build: .
        container_name: service2
        restart: on-failure
        networks:
          - servicenet
        ports:
          - 8887:8761
    
      networks:
        servicenet:
    

Это позволит service1 общаться с service2 через http://service1 и наоборот.

спасибо, в моем случае это было частью решения, после того как я настроил сеть, я столкнулся с проблемой с именами хостов, и это решение заставляет все работать как положено. stackoverflow.com/questions/40849859/…

neninho 12.04.2019 07:46

Другие вопросы по теме