spring 使用 docker-compose 时未检索云属性
spring cloud properties not retrieved when use docker-compose
我遇到了一个奇怪的问题,我为我的每个服务(spring-cloud、eureka、我的服务)创建了一个 Docker 文件,所以当我启动 docker compose,spring 云服务器启动,eureka 启动,但我的应用程序无法从 spring 云中检索配置,但是当我访问 url 时出现在记录它的工作原理,我不知道如何解决这个问题。
关注我的 Docker 文件:
spring云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
Docker撰写
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 但容器无法访问它的原因。容器中的 localhost 只是该容器的环回地址,而不是主机。有几种不同的网络类型(请参阅 https://docs.docker.com/network/),但默认类型是 bridge
。桥接网络将您的容器与主机上的其他容器网络隔离开来,然后将其中一个主机端口上的流量转发到容器端口(由 port: <host>:<container>
条目定义)有几个选项允许容器相互通信:
- 运行 和
network: host
(不推荐)。这将 运行 你的容器直接在你的主机网络上,这样它们就可以通过本地主机相互通信。如果你使用它,你可以摆脱 port:
设置。容器会将服务使用的任何端口直接绑定到主机(如果你想 运行 多个容器使用相同的端口,这也会导致端口冲突。)
- 使用链接(已弃用)
使用用户定义的网络https://docs.docker.com/compose/networking/(推荐)
例如 docker-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 通过 http://service1
与 service2 通信,反之亦然
我遇到了一个奇怪的问题,我为我的每个服务(spring-cloud、eureka、我的服务)创建了一个 Docker 文件,所以当我启动 docker compose,spring 云服务器启动,eureka 启动,但我的应用程序无法从 spring 云中检索配置,但是当我访问 url 时出现在记录它的工作原理,我不知道如何解决这个问题。
关注我的 Docker 文件: spring云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
Docker撰写
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 但容器无法访问它的原因。容器中的 localhost 只是该容器的环回地址,而不是主机。有几种不同的网络类型(请参阅 https://docs.docker.com/network/),但默认类型是 bridge
。桥接网络将您的容器与主机上的其他容器网络隔离开来,然后将其中一个主机端口上的流量转发到容器端口(由 port: <host>:<container>
条目定义)有几个选项允许容器相互通信:
- 运行 和
network: host
(不推荐)。这将 运行 你的容器直接在你的主机网络上,这样它们就可以通过本地主机相互通信。如果你使用它,你可以摆脱port:
设置。容器会将服务使用的任何端口直接绑定到主机(如果你想 运行 多个容器使用相同的端口,这也会导致端口冲突。) - 使用链接(已弃用)
使用用户定义的网络https://docs.docker.com/compose/networking/(推荐)
例如 docker-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 通过 http://service1
与 service2 通信,反之亦然