本地与Docker容器化的两个Spring Boot应用如何共用8080端口?
实现本地与Docker容器中Spring Web项目共享8080端口的方案
核心思路
本地已占用8080端口,Docker容器无法直接映射到该端口,因此通过反向代理统一对外暴露8080端口,根据请求路径转发至不同服务,完全不影响本地项目的JWT验证逻辑。
方案一:用Nginx做反向代理(最常用)
步骤1:调整Docker容器的端口映射
保持Docker内部的Spring项目使用8080端口,将容器端口映射到本地空闲端口(比如8081),启动命令示例:
docker run -d -p 8081:8080 your-spring-docker-image
验证:访问http://localhost:8081能正常打开Docker内的项目即可。
步骤2:配置Nginx转发规则
编辑Nginx的站点配置文件(或nginx.conf),添加以下规则:
server { listen 8080; server_name localhost; # 转发请求到本地Spring项目 location /local/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 转发请求到Docker中的Spring项目 location /docker/ { proxy_pass http://localhost:8081/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
步骤3:重启Nginx生效
重启后即可通过以下地址访问两个项目:
- 本地项目:
http://localhost:8080/local/xxx(xxx为原本地项目的接口路径) - Docker项目:
http://localhost:8080/docker/xxx(xxx为原Docker项目的接口路径)
不影响JWT验证的原因
本地项目的安全过滤器是在接收请求后处理JWT验证的,Nginx仅做请求转发,相当于客户端请求先到Nginx,再转发给本地8080项目,验证逻辑完全不受干扰,和直接访问本地8080效果一致。
方案二:用Caddy做反向代理(更简洁)
若觉得Nginx配置繁琐,可使用Caddy,配置更简单。创建Caddyfile:
localhost:8080 handle /local/* { reverse_proxy http://localhost:8080 } handle /docker/* { reverse_proxy http://localhost:8081 }
启动Caddy后即可直接使用,效果与Nginx一致,适合不想折腾复杂配置的场景。
注意事项
- 若本地Spring Security有IP白名单配置,需将反向代理所在IP(一般为
localhost)加入白名单。 - 如需更复杂的转发规则(如根据域名、请求头),可修改反向代理配置,灵活性极高。
内容的提问来源于stack exchange,提问作者bbe ratb
相关产品推荐
相关产品推荐

