You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Spring Boot+PostgreSQL后无法访问本地服务的问题

问题描述

首次使用Docker,和前端开发者一同部署基于Spring Boot后端+PostgreSQL的开发环境。容器已正常运行,但浏览器和Postman均无法访问后端服务。尝试用0.0.0.0或172.18.0.1访问均无效,另外指定端口映射8181:8181后,发现Tomcat实际启动的是8099端口。

配置信息

第一种配置(未开启端口映射)

docker ps输出:

CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS      NAMES
0cacf9541580   server-backend   "java -jar /server.j…"   6 minutes ago   Up 8 seconds   8089/tcp   server_container
7aa3902d97e6   postgres         "docker-entrypoint.s…"   6 minutes ago   Up 8 seconds   5432/tcp   postgresql_container

对应的docker-compose.yml:

services:
  db:
#    ports:
#      - 5432:5432
    container_name: postgresql_container
    image: postgres
    env_file:
      - .env
    environment:
      - POSTGRES_DB=midas_db
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_USER=${DB_USERNAME}
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
  backend:
    build:
      context: .
    container_name: server_container
#    ports:
#      - 8181:8181
#    extra_hosts:
#      - "host.docker.internal:172.18.0.1"
    env_file:
      - .env
    environment:
      - spring.datasource.url=${DB_URL_DOCKER}
      - spring.datasource.username=${DB_USERNAME}
      - spring.datasource.password=${DB_PASSWORD}
    depends_on:
      - db
    restart: always

第二种配置(开启端口映射)

docker ps输出:

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                              NAMES
58b63f2cc3b3   server-backend   "java -jar /server.j…"   11 seconds ago   Up 9 seconds    8089/tcp, 0.0.0.0:8181->8181/tcp   server_container
ed5efdfc4cf4   postgres         "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:5432->5432/tcp             postgresql_container

对应的docker-compose.yml:

services:
  db:
    ports:
      - 5432:5432
    container_name: postgresql_container
    image: postgres
    env_file:
      - .env
    environment:
      - POSTGRES_DB=midas_db
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_USER=${DB_USERNAME}
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
  backend:
    build:
      context: .
    container_name: server_container
    ports:
      - 8181:8181
#    extra_hosts:
#      - "host.docker.internal:172.18.0.1"
    env_file:
      - .env
    environment:
      - spring.datasource.url=${DB_URL_DOCKER}
      - spring.datasource.username=${DB_USERNAME}
      - spring.datasource.password=${DB_PASSWORD}
    depends_on:
      - db
    restart: always

Dockerfile

FROM maven:3.9.5-openjdk-11-slim
LABEL maintainer="matushkin-2017@mail.ru"
VOLUME /tmp
EXPOSE 8181
ARG JAR_FILE=target/server-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} server.jar
ENTRYPOINT ["java", "-jar", "/server.jar"]
解决方案

核心问题是端口不匹配:配置的映射端口为8181,但Spring Boot实际监听8099端口,导致外部请求无法到达服务。按以下步骤修复:

1. 确认Spring Boot监听端口

检查Spring Boot项目的application.properties或application.yml配置文件,找到server.port项,确认其值为8099。若需统一端口,也可修改为8181,后续步骤对应调整。

2. 修正端口映射配置

如果保持Spring Boot用8099端口,修改docker-compose.yml中backend服务的ports配置,将外部端口转发到容器内的8099:

ports:
  - 8181:8099  # 外部访问8181,转发到容器内的8099

同时建议更新Dockerfile中的EXPOSE声明(仅作文档作用,不影响功能):

EXPOSE 8099

若想让Spring Boot用8181端口,直接修改配置文件中的server.port=8181,保持现有映射配置即可。

3. 确保服务绑定到0.0.0.0

检查Spring Boot配置中是否存在server.address=127.0.0.1,该配置会导致服务仅能在容器内部访问。删除该配置或设置为server.address=0.0.0.0,确保服务监听容器的所有网络接口。

4. 验证容器内端口监听

进入backend容器,检查端口监听状态:

docker exec -it server_container bash
# 若容器无netstat,先安装
apt update && apt install -y net-tools
netstat -tulpn | grep java

确认输出中存在0.0.0.0:8099(或你设置的端口),说明服务正常监听。

5. 重启容器生效

修改配置后,重新构建并启动容器:

docker-compose down && docker-compose up --build

额外说明

  • 第一种配置未开启端口映射,外部无法直接访问容器内的任何端口,属于正常现象;
  • 第二种配置虽开启映射,但端口不匹配,因此访问失败;
  • 访问时直接使用宿主机IP+映射的外部端口(比如http://你的宿主机IP:8181)即可,无需使用0.0.0.0或容器内部IP。

内容的提问来源于stack exchange,提问作者1dlvb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:36:03