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

