首页 > 解决方案 > 码头港口不可用

问题描述

我有一个试图通过 Docker 运行的 spring-config-sever 项目。我可以从命令行运行它,我的其他服务和浏览器通过以下方式成功连接:

http://localhost:8980/aservice/dev

但是,如果我通过 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 run my-config-server -p 8980:8980

然后我确认它正在运行

码头工人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:对“ http://localhost:8980/aservice/dev ”的 GET 请求出现 I/O 错误:连接被拒绝(连接被拒绝);

标签: spring-bootdocker

解决方案


根据评论添加完整答案。

首先,您必须-p在图像名称之前指定。 docker run -p 8980:8980 my-config-server.

其次,仅localhost使用主机端口进行配置不会使您的 my-service 容器与其他容器通信。locahost在容器内(不是主机)。您将需要使用适当的docker 网络模型,以便两个容器可以相互通信。

如果您使用的是 Linux,则默认设置是Bridge您可以将 my-config-server 容器 ipdocker 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 启动两个容器,则可以使用服务名称链接两个容器。只需遵循Compose 中的 Networking 即可


推荐阅读