свойства весеннего облака не извлекаются при использовании docker-compose - PullRequest
0 голосов
/ 10 апреля 2019

У меня странная проблема, я создаю DockerFile для каждого из моих сервисов (spring-cloud, eureka, my-service), поэтому, когда я запускаю docker compose, запускается весенний облачный сервер, 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

Файл eureka 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

Docker compose

  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

когда я пытаюсь запустить свое приложение (product-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

отлично работает.

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

1 Ответ

1 голос
/ 11 апреля 2019

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

  • Запуск с network: host (не рекомендуется) .Это будет запускать ваши контейнеры непосредственно на вашемхост-сеть, чтобы все они могли общаться друг с другом через локальный хост. Если вы используете эту возможность, вы можете избавиться от настройки port:. Контейнер будет связывать любые порты, которые служба использует напрямую с хостом (это также может привести к конфликтам портов, еслиВы хотите запустить несколько контейнеров, использующих один и тот же порт.)
  • Использовать ссылки (устарело)
  • Использовать пользовательские сети https://docs.docker.com/compose/networking/ (рекомендуется)
    exdocker-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 aи наоборот

...