在一台服务器上使用 Docker 部署多个 Spring Boot 应用是完全可行的,而且是常见的做法。你可以将每个 Spring Boot 应用打包为一个独立的 Docker 容器,并通过 Docker 网络、端口映射等方式实现容器之间的隔离和通信。
下面是一个完整的流程指南,帮助你在一台服务器上部署多个 Spring Boot 应用的 Docker 容器:
📦 一、准备 Spring Boot 项目
确保你的 Spring Boot 项目可以正常运行并支持构建为 Docker 镜像。
示例:pom.xml 中配置 spring-boot-maven-plugin(用于构建 jar)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
然后执行 Maven 构建命令生成可执行 jar 包:
mvn clean package
🐳 二、编写 Dockerfile 文件
为每个 Spring Boot 应用创建一个 Dockerfile,例如:
# 使用基础镜像
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 拷贝 jar 包到容器中
COPY your-application.jar app.jar
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
然后构建镜像:
docker build -t springboot-app1 .
为另一个应用重复这个过程,比如命名为 springboot-app2。
🌐 三、运行多个容器并指定不同端口
你可以使用 -p 参数映射不同的主机端口,避免冲突。
# 运行第一个应用
docker run -d -p 8080:8080 --name app1 springboot-app1
# 运行第二个应用
docker run -d -p 8081:8080 --name app2 springboot-app2
说明:
-d表示后台运行。-p 主机端口:容器端口,这样你就可以通过不同的端口访问不同的应用。--name给容器命名,方便管理。
🔧 四、使用 Docker Compose(推荐方式)
如果你有多个服务,建议使用 docker-compose.yml 来统一管理。
version: '3.8'
services:
app1:
image: springboot-app1
ports:
- "8080:8080"
container_name: springboot-app1
app2:
image: springboot-app2
ports:
- "8081:8080"
container_name: springboot-app2
然后启动所有服务:
docker-compose up -d
停止服务:
docker-compose down
🔐 五、注意事项
- 端口冲突:确保每个容器映射的主机端口不冲突。
- 资源限制:如果服务器资源有限,注意控制每个容器的 CPU 和内存使用。
- 网络互通:如果需要容器之间通信,可以自定义 Docker 网络。
- 日志管理:使用
docker logs [容器名]查看日志。 - 持久化数据:如果有文件或数据库需要持久化,记得挂载 volume。
✅ 六、总结
| 步骤 | 内容 |
|---|---|
| 1 | 每个 Spring Boot 应用单独打包成 Docker 镜像 |
| 2 | 使用 docker run 或 docker-compose 启动多个容器 |
| 3 | 映射不同端口,避免冲突 |
| 4 | 使用 Docker Compose 可以更方便地管理多个容器 |
如需进一步优化,还可以考虑以下内容:
- 使用 Nginx 做反向X_X,根据域名或路径分发请求
- 使用 Docker Swarm 或 Kubernetes 实现容器编排
- 使用健康检查、自动重启等高级功能
如果你有具体的 Spring Boot 项目结构或需求,也可以贴出来,我可以帮你定制 Dockerfile 或 docker-compose.yml。
是否需要我为你写一个完整的示例?
云知识