Я столкнулся со странной проблемой, я создаю 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
это работает нормально.
Есть ли у кого-нибудь идея помочь мне с этой проблемой?
Контейнеры 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/…