别再手动配环境了!用Docker Compose一键部署SpringBoot+Vue项目(附Nginx配置)
·
全栈开发者的效率革命:Docker Compose自动化部署SpringBoot+Vue全攻略
在传统全栈项目部署中,开发者往往需要经历这样的折磨:先在服务器安装Java环境,配置MySQL用户权限,调试Nginx反向代理,再处理前端静态资源部署。这种重复劳动不仅消耗时间,更会在不同环境间产生"在我机器上能跑"的经典问题。而容器化技术正将这一过程简化为 docker-compose up -d 的单行命令。
1. 环境准备与工具链配置
1.1 开发环境标准化
全栈项目涉及多语言工具链,传统方式需要手动安装:
- Java开发套件 :JDK8+、Maven/Gradle
- 前端工具链 :Node.js 14+、npm/yarn
- 容器运行时 :Docker Engine 20.10+
- 编排工具 :Docker Compose v2.2+
通过容器化,这些依赖全部封装在镜像中。只需确保宿主机安装Docker即可:
# 在Linux上安装Docker引擎
curl -fsSL https://get.docker.com | sh
# 启用守护进程并设置开机自启
sudo systemctl enable --now docker
1.2 项目结构优化
典型的SpringBoot+Vue项目需要调整目录结构以适应容器化部署:
project-root/
├── backend/
│ ├── src/
│ ├── Dockerfile
│ └── pom.xml
├── frontend/
│ ├── public/
│ ├── src/
│ └── Dockerfile
├── nginx/
│ └── nginx.conf
└── docker-compose.yml
提示:使用多阶段构建可以显著减小最终镜像体积,例如前端构建阶段使用node镜像,运行时使用nginx镜像
2. 容器化SpringBoot后端服务
2.1 高效Dockerfile编写
后端Dockerfile需要关注以下优化点:
# 构建阶段
FROM maven:3.8.6-eclipse-temurin-17 as builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ ./src/
RUN mvn package -DskipTests
# 运行阶段
FROM eclipse-temurin:17-jre
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY --from=builder /app/${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
关键优化包括:
- 分离依赖下载与源码构建,利用Docker缓存层
- 使用轻量级JRE基础镜像而非完整JDK
- 添加/tmp卷提高SpringBoot启动速度
2.2 生产环境配置管理
通过环境变量注入配置,避免硬编码敏感信息:
# application-prod.yml
spring:
datasource:
url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
username: ${DB_USER}
password: ${DB_PASSWORD}
redis:
host: ${REDIS_HOST}
在docker-compose中对应配置:
environment:
- SPRING_PROFILES_ACTIVE=prod
- DB_HOST=mysql
- DB_NAME=app_db
- DB_USER=app_user
- DB_PASSWORD=secure_password
3. Vue前端容器化实践
3.1 多阶段构建优化
前端Dockerfile的典型模式:
# 构建阶段
FROM node:16 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 生产阶段
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
构建时可添加 --build-arg 参数处理环境变量:
docker build --build-arg VUE_APP_API_BASE_URL=/api -t frontend .
3.2 前端路由与静态资源处理
Nginx配置需要特别注意history模式的路由回退:
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
常见问题解决方案:
- 静态资源404:检查vue.config.js的publicPath配置
- API请求跨域:开发环境配置proxy,生产环境使用Nginx路径转发
- 路由刷新白屏:确保Nginx try_files配置正确
4. 一体化编排与生产部署
4.1 完整的docker-compose配置
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: user_password
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 10
redis:
image: redis:6-alpine
volumes:
- redis_data:/data
backend:
build: ./backend
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
environment:
SPRING_PROFILES_ACTIVE: prod
DB_HOST: mysql
DB_PORT: 3306
REDIS_HOST: redis
ports:
- "8080:8080"
frontend:
build: ./frontend
depends_on:
- backend
ports:
- "80:80"
nginx:
image: nginx:alpine
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- frontend
ports:
- "443:443"
- "80:80"
volumes:
mysql_data:
redis_data:
关键配置说明:
- 使用健康检查确保服务启动顺序
- 命名卷持久化数据库数据
- 网络隔离保障服务间安全通信
- 多Nginx实例实现蓝绿部署
4.2 高级部署策略
零停机更新方案 :
# 滚动更新后端服务
docker-compose pull backend
docker-compose up -d --no-deps backend
# 蓝绿部署前端
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
对应的扩展配置:
# docker-compose.prod.yml
services:
frontend:
build:
context: ./frontend
args:
- VUE_APP_API_BASE_URL=/api/v2
labels:
- "traefik.http.routers.frontend-new.rule=Host(`example.com`)"
- "traefik.http.routers.frontend-new.entrypoints=web"
5. 监控与日志管理实战
5.1 集中式日志收集
在docker-compose中添加日志驱动:
services:
backend:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
使用ELK栈分析日志:
docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8.4.1
docker run -d --name kibana --link elasticsearch -p 5601:5601 kibana:8.4.1
docker run -d --name logstash -v ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf logstash:8.4.1
5.2 性能监控方案
Prometheus配置示例:
monitoring:
image: prom/prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
SpringBoot应用需添加监控端点:
management.endpoints.web.exposure.include=health,info,metrics,prometheus
management.metrics.export.prometheus.enabled=true
6. 安全加固实践
6.1 容器安全基线
- 使用非root用户运行容器
- 限制资源使用
- 只读文件系统
services:
backend:
user: "1000:1000"
read_only: true
security_opt:
- "no-new-privileges:true"
deploy:
resources:
limits:
cpus: '1'
memory: 512M
6.2 网络隔离策略
自定义网络实现微服务隔离:
docker network create --driver bridge frontend_network
docker network create --driver bridge backend_network
在compose文件中指定网络:
networks:
frontend:
driver: bridge
internal: true
backend:
driver: bridge
services:
frontend:
networks:
- frontend
backend:
networks:
- backend
- frontend
这种架构下,前端服务无法直接访问数据库,必须通过后端服务中转
更多推荐

所有评论(0)