无法连接到本地运行在Docker上的Spring Boot应用

时间:2020-07-31 13:59:10

标签: spring-boot docker docker-desktop

我坚持无法在浏览器的localhost:8091上打开我的REST Spring Boot应用的问题。
这是我的docker-compose.xml(一切都本地部署在Docker Desktop上):

version: '3.3'

services:
  postgres:
    build:
      context: services/postgres
      dockerfile: Dockerfile.development
    command: postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRESS_USER=postgres
      - POSTGRESS_DB=postgres
      - POSTGRESS_PASSWORD=qqq
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
      - "db-data:/var/lib/postgresql/data"
  
  
  app:
    build:
      context: services/app
      dockerfile: Dockerfile.development
    command: java -jar ./app.jar
    environment:
      - PORT=8091
    network_mode: host  
    image: 'my-java-app'
    ports:
      - 8091:8091
    depends_on:
      - postgres

  angular:
    build:
      context: services/angularfrontend
      dockerfile: Dockerfile.development
    image: 'my-angular-app'
    ports:
        - 80:80   
        
volumes:
   db-data:  

Spring Boot App通常在8091上启动并连接到数据库,但是随后我无法从本地计算机对其API进行调用(“连接被拒绝”)。 Angular应用正常打开(在localhost:80上),但无法调用localhost:8091 Spring Boot应用。 enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

从角度服务容器到localhost:8091的调用失败,对吗? 尝试在有角度的前端容器中覆盖对后端的调用 使用 app:8091 (这是调用后端服务的方式)而不是localhost:8091。 在“角度”容器中,本地主机不会转换为“应用”容器。

您不能使用localhost从一个容器进入另一个容器。 容器内的本地主机将转换为该容器的ip。

尝试在您的角度应用程序中调用可配置的后端,然后在使用环境的docker-compose中覆盖该配置。 还要对springboot应用程序应用程序执行此操作。 我看不到在环境中您覆盖对postgress的调用。 在删除network_mode:host

之后,在application.properties中公开该配置并在docker-compose中覆盖。

答案 1 :(得分:0)

如果您确实要使用network_mode: host,则无需指定<source>:<dest>,因为该应用程序直接在主机网络上监听8091:

...
app:
    build:
      context: services/app
      dockerfile: Dockerfile.development
    command: java -jar ./app.jar
    environment:
      - PORT=8091
    network_mode: host  
    image: 'my-java-app'
    depends_on:
      - postgres
...

如果您要像其他容器一样运行Java应用程序,只需从构成文件中删除这一行,网络模式将默认为桥接:

network_mode: host