【问题标题】:docker ports not available码头港口不可用
【发布时间】:2018-12-30 18:42:18
【问题描述】:

我有一个试图通过 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:GET 请求时出现 I/O 错误 “http://localhost:8980/aservice/dev”:连接被拒绝(连接 拒绝);

【问题讨论】:

  • 看起来主机端口未映射。试试docker run -p 8980:8980 my-config-server
  • 我认为这是一个好的开始——通过更改每个 Imran 的命令,我可以在 Docker 中运行配置服务器,并在浏览器中查看属性。但是,其他 Dockerized 服务仍然获得c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: I/O error on GET request for "http://localhost:8980/aservice/dev": Connection refused 。我通过以下方式启动这些服务:docker run -e "SPRING_PROFILES_ACTIVE=dev" -p 3009:8980 -t aservice

标签: spring-boot docker


【解决方案1】:

根据 cmets 添加完整答案。

首先,您必须在图像名称之前指定-pdocker 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

【讨论】:

  • 感谢您的出色回答。我在我的 Mac 上通过“ifconfig”找到了我的本地 IP。然后我通过:docker run -e "SPRING_PROFILES_ACTIVE=dev" -e "SPRING_CLOUD_CONFIG_URL=HTTP://10.0.0.143:8980" -p 3009:8980 -t my-config-server
【解决方案2】:

我可以想象应用程序只监听本地主机,即 127.0.0.1。

您可能想尝试将属性server.address 设置为0.0.0.0。 那么8980端口也应该对外可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2014-07-17
    相关资源
    最近更新 更多