如何在同一机器同一端口运行两个Tomcat部署的Java应用?
同一机器同端口运行两个Tomcat Java应用的Docker实现方案
完全可以通过Docker实现,核心思路是用反向代理容器作为流量入口,根据请求路径/域名将流量转发到不同的Tomcat应用容器,避免直接端口冲突。以下是具体实现步骤:
1. 准备应用镜像
将两个Java应用分别打包成包含Tomcat的Docker镜像,比如命名为my-app1:v1和my-app2:v1,每个镜像内的Tomcat默认使用容器内部的8080端口(无需修改)。
2. 配置反向代理(以Nginx为例)
创建Nginx配置文件nginx.conf,通过路径规则区分两个应用:
server { listen 80; # 转发到第一个Tomcat应用 location /app1/ { proxy_pass http://app1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 转发到第二个Tomcat应用 location /app2/ { proxy_pass http://app2:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
这里的app1和app2是后续Docker容器的名称,同一Docker网络内可直接通过容器名访问。
3. 用Docker Compose编排容器
创建docker-compose.yml来统一管理三个容器(两个应用+一个代理):
version: '3' services: app1: image: my-app1:v1 networks: - app-network app2: image: my-app2:v1 networks: - app-network nginx-proxy: image: nginx:alpine ports: - "80:80" # 宿主机80端口映射到Nginx容器的80端口 volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf networks: - app-network networks: app-network: driver: bridge
自定义网络app-network确保容器间可以互相访问,避免依赖默认网络的不确定性。
4. 启动与验证
执行以下命令启动所有容器:
docker-compose up -d
启动完成后,通过以下地址访问应用:
- 第一个应用:
http://localhost/app1/ - 第二个应用:
http://localhost/app2/
两个应用共享宿主机的80端口,由Nginx负责流量分发。
可选:域名区分方案
如果想用不同域名访问,修改Nginx配置为多server块即可:
server { listen 80; server_name app1.example.com; location / { proxy_pass http://app1:8080/; proxy_set_header Host $host; } } server { listen 80; server_name app2.example.com; location / { proxy_pass http://app2:8080/; proxy_set_header Host $host; } }
只需在本地hosts文件或DNS服务器中配置域名指向宿主机IP,即可通过app1.example.com和app2.example.com访问对应应用。
内容的提问来源于stack exchange,提问作者arpit joshi
相关产品推荐
相关产品推荐

