使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint

Posted

技术标签:

【中文标题】使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint【英文标题】:Can't access spring-boot rest-endpoint inside docker container when using docker-compose 【发布时间】:2019-11-14 03:15:42 【问题描述】:

我正在使用 docker-compose 在 docker 中设置 spring-boot 应用程序,并且需要从我的本地主机端口 8080 上的一个应用程序访问一个休息端点。以下端点在本地启动时工作正常http://localhost:8080/central/products

我在 ubuntu 19.10 上运行 docker 版本 18.09.5。当我像https://spring.io/guides/gs/spring-boot-docker/ 中解释的那样为docker 设置一个简单的spring-boot 应用程序时,一切都按预期工作,我可以到达http://localhost:8080/ 上的端点。但是,当我使用 docker-compose 启动更多服务时,我无法从本地主机访问此端点。

用于构建 spring-boot 应用程序的 Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY $DEPENDENCY/BOOT-INF/lib /app/lib
COPY $DEPENDENCY/META-INF /app/META-INF
COPY $DEPENDENCY/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","sample.EfridgeCentralApplication"]

似乎导致问题的 docker-compose.yml 文件:

version: '3.7'
services:
  central-london:
    image: demo/efridge-central:latest
    container_name: central-london
    ports:
      - 8080:8080
    environment:
      - SERVER_PORT=8080
      - SPRING_PROFILES_ACTIVE=dev
      - SPRING_DATA_MONGODB_HOST=mongo-central
      - SPRING_DATA_MONGODB_PORT=27017
      - APP_RABBIT_HOSTNAME=rabbit-efridge

  factory-usa:
    image: demo/efridge-factory:latest
    container_name: factory-usa
    ports:
      - 8081:8081
    environment:
      - SERVER_PORT=8081
      - SPRING_PROFILES_ACTIVE=usa
      - SPRING_DATA_MONGODB_HOST=mongo-usa
      - SPRING_DATA_MONGODB_PORT=27017
      - APP_RABBIT_HOSTNAME=rabbit-efridge

  factory-china:
    image: demo/efridge-factory:latest
    container_name: factory-china
    ports:
      - 8082:8082
    environment:
      - SERVER_PORT=8082
      - SPRING_PROFILES_ACTIVE=china
      - SPRING_DATA_MONGODB_HOST=mongo-china
      - SPRING_DATA_MONGODB_PORT=27017
      - APP_RABBIT_HOSTNAME=rabbit-efridge

  mongo-central:
    image: mongo:latest
    container_name: mongo-central
    hostname: mongo-central
    ports:
      - 27017:27017

  mongo-usa:
    image: mongo:latest
    container_name: mongo-usa
    hostname: mongo-usa
    ports:
      - 27018:27017

  mongo-china:
    image: mongo:latest
    container_name: mongo-china
    hostname: mongo-china
    ports:
      - 27019:27017

  rabbit-efridge:
    image: rabbitmq:3-management
    container_name: rabbit-efridge
    hostname: rabbit-efridge
    ports:
      - 15672:15672
      - 5672:5672

来自 docker 检查的输出:

"NetworkSettings": 
            "Bridge": "",
            "SandboxID": "b91760f810a656e382d702dd408afe3c5ffcdf4c0cd15ea8550150867ac038cc",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": 
                "8080/tcp": [
                    
                        "HostIp": "0.0.0.0",
                        "HostPort": "8080"
                    
                ]
            

来自 spring-boot 的日志

2019-07-03 11:54:57.654  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-07-03 11:54:57.803  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-07-03 11:54:57.804  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-07-03 11:54:58.149  INFO 1 --- [           main] o.a.c.c.C.[.[localhost].[/central]       : Initializing Spring embedded WebApplicationContext
2019-07-03 11:54:58.150  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 6950 ms
2019-07-03 11:54:59.810  INFO 1 --- [           main] org.mongodb.driver.cluster               : Cluster created with settings hosts=[mongo-central:27017], mode=MULTIPLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500
2019-07-03 11:54:59.810  INFO 1 --- [           main] org.mongodb.driver.cluster               : Adding discovered server mongo-central:27017 to client view of cluster
2019-07-03 11:55:00.256  INFO 1 --- [o-central:27017] org.mongodb.driver.connection            : Opened connection [connectionIdlocalValue:1, serverValue:11] to mongo-central:27017

工作 spring-boot 容器的 docker inspect 的输出和不工作的输出看起来几乎相同。我还可以通过 mongo 客户端访问 rabbitmq Web 界面和 MongoDB。唯一不起作用的是通过http://localhost:8080/central/products 访问其余端点。

【问题讨论】:

错误是什么?连接被拒绝,还是其他原因? 此类问题的常见原因是配置为仅侦听 127.0.0.1 的服务(查找“侦听地址”或“绑定地址”类型设置)。要从其他容器访问,它必须绑定到 0.0.0.0(“所有接口”)。 当我做curl -v http://localhost:8080/central/products时,我得到Recv failure: Connection reset by peer 【参考方案1】:

您的 Dockerfile 缺少 EXPOSE 语句,因此没有端口暴露给外部世界。

一旦您将EXPOSE 8080 添加到 Dockerfile 的底部,您的应用就可以从容器外部访问。

【讨论】:

感谢您的帮助!我会试试看,让你知道。但后来我想知道为什么它与我在问题中提供的 spring 示例一起工作。也没有 EXPOSE,它工作正常。 基础镜像已经暴露了 8080 端口。如果你有任何项目的 github repo,我很想看看 遗憾的是这并没有解决问题。我仍然得到同样的错误 有回购吗?? 它目前在私人托管的 git 上。今天晚些时候我可以把它放在github上。感谢您的帮助【参考方案2】:

问题是由application.properties 文件引起的,我仍然在该文件中指定了server.address=localhost

删除此行解决了问题!

【讨论】:

以上是关于使用docker-compose时无法访问docker容器内的spring-boot rest-endpoint的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker-compose 启动 postgres docker 容器

docker-compose java 无法访问 jarfile

docker-compose部署mysql无法访问

docker-compose:无法从我的 LEMP 堆栈访问 phpMyAdmin

为啥我无法从本地主机上的 Gitlab CI 连接到我的 docker-compose 服务

Pycharm docker-compose解释器不加载库