我有一个尝试通过Docker运行的spring-config-sever项目。我可以从命令行运行它,其他服务和浏览器可以通过以下方式成功连接:
但是,如果我通过Docker运行它,则调用会失败。
我的配置服务器上有一个Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE=build/libs/my-config-server-0.1.0.jar
ADD ${JAR_FILE} my-config-server-0.1.0.jar
EXPOSE 8980
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/my-config-server-0.1.0.jar"]
我通过以下方式构建:
docker build -t my-config-server
我通过以下方式运行它:
docker运行my-config-server -p 8980:8980
然后我确认它正在通过
运行docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1cecafdf99fe my-config-server "java -Djava.securit…" 14 seconds ago Up 13 seconds 8980/tcp suspicious_brahmagupta
当我通过Docker运行它时,浏览失败并显示“ ERR_CONNECTION_REFUSED”,而我的呼叫服务失败并显示:
无法找到PropertySource:GET请求的I / O错误 “ http://localhost:8980/aservice/dev”:连接被拒绝(连接 拒绝);
答案 0 :(得分:1)
根据评论添加完整答案。
首先,您必须在图像名称之前指定-p
。
docker run -p 8980:8980 my-config-server
。
第二,仅使用主机端口配置localhost
不会使您的my-service容器与其他容器通信。容器中的locahost
位于自身(而非主机)内部。您将需要使用适当的docker networking model,以便两个容器都可以相互通信。
如果您使用的是Linux,则默认值为Bridge
,因此可以将my-config-server容器ip docker inspect {containerIp-of-config-server}
配置为配置服务器端点。
例如,如果您的my-config-server ip为172.17.0.2,则端点为-http://172.17.0.2:8980/
spring:
cloud:
config:
uri: http://172.17.0.2:8980
只需遵循docker文档,就对网络的工作原理有更多了解。 https://docs.docker.com/network/network-tutorial-standalone/ https://docs.docker.com/v17.09/engine/userguide/networking/
如果要使用docker-compose启动两个容器,则可以使用服务名称链接两个容器。只需遵循Networking in Compose。
答案 1 :(得分:0)
我可以想象该应用程序仅在本地主机(即127.0.0.1)上侦听。
您可能想尝试将属性server.address
设置为0.0.0.0
。
然后端口8980也应该在外部可用。