如何在同一端口部署两个Spring Boot Web应用并使用不同端点(Docker+AWS EC2环境)
嗨,我来帮你搞定这个问题!你之前部署失败的原因很简单——两个容器都想抢占EC2宿主机的80端口,自然会冲突啦。下面给你一套最实用的解决方案,用Nginx反向代理来实现同一端口下的不同路由,再配合Docker Compose来管理所有服务,操作起来超顺畅:
第一步:调整Spring Boot应用的上下文路径
首先给每个应用设置独立的上下文路径,这样不仅能和外部访问的端点对应,还能避免容器内部的路径混淆:
- 对于应用1,在
application.properties(或application.yml)中添加:server.servlet.context-path=/app1 server.port=8080 - 对于应用2,同理修改:
server.servlet.context-path=/app2 server.port=8081
设置完成后,应用1在容器内的访问路径就是http://localhost:8080/app1,应用2是http://localhost:8081/app2,彼此端口不冲突。
第二步:为每个应用编写Dockerfile
给每个Spring Boot应用单独写Dockerfile,用来构建镜像:
应用1的Dockerfile(放在app1目录下)
# 选择轻量级的JDK镜像,这里用OpenJDK 17版本 FROM openjdk:17-jdk-slim # 把打包好的jar包复制到容器内指定目录 COPY target/app1.jar /app/app1.jar # 设置容器工作目录 WORKDIR /app # 暴露容器内部的服务端口 EXPOSE 8080 # 启动应用的命令 CMD ["java", "-jar", "app1.jar"]
应用2的Dockerfile(放在app2目录下)
只需替换对应的jar包名称和端口即可:
FROM openjdk:17-jdk-slim COPY target/app2.jar /app/app2.jar WORKDIR /app EXPOSE 8081 CMD ["java", "-jar", "app2.jar"]
第三步:配置Nginx反向代理
创建一个nginx.conf文件,用来设置路由规则,把宿主机80端口的请求转发到对应的应用容器:
events {} http { server { listen 80; # 转发/app1开头的请求到应用1容器 location /app1/ { proxy_pass http://app1:8080/app1/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 转发/app2开头的请求到应用2容器 location /app2/ { proxy_pass http://app2:8081/app2/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
这里的app1和app2是后面Docker Compose中服务的名称,Docker会自动解析这些名称到对应的容器IP,不用手动写IP地址。
第四步:用Docker Compose编排所有服务
创建docker-compose.yml文件,把三个服务(应用1、应用2、Nginx)整合起来,一键启动:
version: '3.8' services: app1: build: ./app1 # 指定应用1的Dockerfile所在目录 container_name: spring-app1 restart: unless-stopped # 容器意外停止时自动重启 app2: build: ./app2 # 指定应用2的Dockerfile所在目录 container_name: spring-app2 restart: unless-stopped nginx: image: nginx:alpine # 用轻量级的Alpine版本Nginx镜像 container_name: reverse-proxy ports: - "80:80" # 把宿主机的80端口映射到Nginx容器的80端口 volumes: - ./nginx.conf:/etc/nginx/nginx.conf # 挂载自定义配置文件到容器内 depends_on: - app1 - app2 # 确保Nginx在两个应用启动后再启动 restart: unless-stopped
第五步:在AWS EC2上部署并配置
安装Docker和Docker Compose
如果是Amazon Linux系统,执行以下命令:# 安装Docker sudo yum install docker -y # 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 安装Docker Compose sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose如果是Ubuntu系统,把
yum换成apt即可。上传文件到EC2
把app1目录、app2目录、nginx.conf、docker-compose.yml这几个文件/目录上传到EC2实例的某个目录(比如/home/ec2-user/apps)。启动所有服务
进入上传的目录,执行以下命令后台启动服务:sudo docker-compose up -d配置EC2安全组
登录AWS控制台,找到你的EC2实例,进入安全组设置,添加一条入站规则:- 类型:HTTP
- 端口范围:80
- 源:根据需求设置,比如允许所有IP访问就选
0.0.0.0/0,或者指定你的IP范围。
验证访问
完成以上步骤后,你就可以通过以下地址访问两个应用了:
- 应用1:
http://你的EC2公网IP/app1 - 应用2:
http://你的EC2公网IP/app2
备注:内容来源于stack exchange,提问作者deathstroke

