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

如何在同一端口部署两个Spring Boot Web应用并使用不同端点(Docker+AWS EC2环境)

如何在同一端口部署两个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上部署并配置

  1. 安装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即可。

  2. 上传文件到EC2
    把app1目录、app2目录、nginx.conf、docker-compose.yml这几个文件/目录上传到EC2实例的某个目录(比如/home/ec2-user/apps)。

  3. 启动所有服务
    进入上传的目录,执行以下命令后台启动服务:

    sudo docker-compose up -d
    
  4. 配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:19:36