Docker部署前后端项目完整教程(基于Spring Boot项目)

发布于:2025-07-09 ⋅ 阅读:(30) ⋅ 点赞:(0)

📚目录

1. Docker单独部署后端项目

1.1 环境准备

前置条件

检查Docker是否安装成功

1.2 Spring Boot项目准备

项目结构示例

application.yml配置

1.3 创建Dockerfile

基础版Dockerfile

优化版Dockerfile

1.4 构建Docker镜像

1. 打包Spring Boot应用

2. 构建Docker镜像

3. 镜像优化技巧

1.5 运行Docker容器

基本运行命令

容器管理命令

1.6 数据持久化

挂载卷示例

2. Docker单独部署前端项目

2.1 前端项目准备

Vue.js项目结构示例

Vue配置文件(vue.config.js)

2.2 创建前端Dockerfile

多阶段构建Dockerfile

2.3 Nginx配置文件

nginx.conf配置

2.4 构建和运行前端容器

构建镜像

运行容器

3. Docker Compose介绍

3.1 什么是Docker Compose

3.2 Docker Compose的优势

3.3 Docker Compose文件结构

基本结构

4. Docker Compose部署完整项目

4.1 项目架构设计

4.2 创建docker-compose.yml

完整的docker-compose.yml

4.3 目录结构组织

4.4 环境配置文件

.env文件

docker-compose.override.yml (开发环境)

4.5 启动和管理服务

常用命令

5. 完整实战案例:从零到部署

5.1 项目初始化

1. 创建项目目录

2. 初始化Spring Boot项目

5.2 后端代码实现

Controller示例

实体类示例

5.3 前端代码实现

Vue组件示例

5.4 数据库初始化

init.sql

5.5 一键部署脚本

deploy.sh

6. 项目验证与测试

6.1 服务健康检查

健康检查脚本

6.2 API测试

使用curl测试API

6.3 性能测试

简单压力测试

7. 常见问题与解决方案

7.1 容器启动问题

问题1:容器启动失败

问题2:数据库连接失败

7.2 网络连接问题

服务间无法通信

7.3 性能优化

镜像优化

资源限制

7.4 数据持久化问题

确保数据不丢失

8. 部署到生产环境

8.1 生产环境配置

docker-compose.prod.yml

8.2 安全配置

环境变量管理

Nginx SSL配置

8.3 监控和日志

日志配置

8.4 自动部署脚本

CI/CD部署脚本

8.5 备份和恢复

数据备份脚本

总结


1. Docker单独部署后端项目

1.1 环境准备

前置条件
  • 已安装Docker
  • Java 8/11/17开发环境
  • Maven或Gradle构建工具
  • Spring Boot项目
检查Docker是否安装成功
docker --version
docker-compose --version

1.2 Spring Boot项目准备

项目结构示例
my-spring-app/
├── src/
│   └── main/
│       ├── java/
│       └── resources/
│           └── application.yml
├── Dockerfile
├── pom.xml
└── target/
    └── my-app-1.0.0.jar
application.yml配置
server:
  port: 8080
  
spring:
  datasource:
    url: jdbc:mysql://mysql-db:3306/mydb
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    
management:
  endpoints:
    web:
      exposure:
        include: health,info

1.3 创建Dockerfile

基础版Dockerfile
# 使用官方OpenJDK基础镜像
FROM openjdk:11-jre-slim

# 设置维护者信息
LABEL maintainer="your-email@example.com"

# 设置工作目录
WORKDIR /app

# 复制jar包到容器中
COPY target/my-app-1.0.0.jar app.jar

# 暴露端口
EXPOSE 8080

# 运行应用
ENTRYPOINT ["java", "-jar", "app.jar"]
优化版Dockerfile
# 使用官方OpenJDK基础镜像
FROM openjdk:11-jre-slim

# 设置维护者信息
LABEL maintainer="your-email@example.com"

# 安装必要的工具
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*

# 创建非root用户
RUN addgroup --system spring && adduser --system spring --ingroup spring

# 设置工作目录
WORKDIR /app

# 复制jar包到容器中
COPY target/my-app-1.0.0.jar app.jar

# 修改文件所有者
RUN chown spring:spring app.jar

# 切换到非root用户
USER spring

# 设置JVM参数
ENV JAVA_OPTS="-Xmx512m -Xms256m"

# 暴露端口
EXPOSE 8080

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

# 运行应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

1.4 构建Docker镜像

1. 打包Spring Boot应用
# 使用Maven打包
mvn clean package -DskipTests

# 或使用Gradle打包
./gradlew clean build
2. 构建Docker镜像
# 基本构建命令
docker build -t my-spring-app:latest .

# 带标签的构建
docker build -t my-spring-app:v1.0 .

# 查看构建的镜像
docker images
3. 镜像优化技巧
# 多阶段构建Dockerfile
FROM maven:3.8.4-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/my-app-1.0.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

1.5 运行Docker容器

基本运行命令
# 基本运行
docker run -d --name my-spring-container -p 8080:8080 my-spring-app:latest

# 带环境变量运行
docker run -d --name my-spring-container \
  -p 8080:8080 \
  -e SPRING_PROFILES_ACTIVE=prod \
  -e JAVA_OPTS="-Xmx1g" \
  my-spring-app:latest
容器管理命令
# 查看运行中的容器
docker ps

# 查看容器日志
docker logs my-spring-container

# 实时查看日志
docker logs -f my-spring-container

# 进入容器
docker exec -it my-spring-container /bin/bash

# 停止容器
docker stop my-spring-container

# 删除容器
docker rm my-spring-container

1.6 数据持久化

挂载卷示例
# 挂载配置文件
docker run -d --name my-spring-container \
  -p 8080:8080 \
  -v /host/config:/app/config \
  -v /host/logs:/app/logs \
  my-spring-app:latest

2. Docker单独部署前端项目

2.1 前端项目准备

Vue.js项目结构示例
my-vue-app/
├── src/
├── public/
├── package.json
├── vue.config.js
├── Dockerfile
├── nginx.conf
└── dist/
Vue配置文件(vue.config.js)
module.exports = {
  publicPath: '/',
  outputDir: 'dist',
  devServer: {
    port: 3000,
    proxy: {
      '/api': {
        target: 'http://localhost:8080',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}

2.2 创建前端Dockerfile

多阶段构建Dockerfile
# 第一阶段:构建应用
FROM node:16-alpine AS builder

# 设置工作目录
WORKDIR /app

# 复制package文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源代码
COPY . .

# 构建应用
RUN npm run build

# 第二阶段:运行应用
FROM nginx:alpine

# 复制自定义nginx配置
COPY nginx.conf /etc/nginx/nginx.conf

# 从构建阶段复制dist文件
COPY --from=builder /app/dist /usr/share/nginx/html

# 暴露端口
EXPOSE 80

# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

2.3 Nginx配置文件

nginx.conf配置
events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    
    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log;
    
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    # Gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript 
               application/x-javascript application/xml+rss 
               application/javascript application/json;
    
    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.html;
        
        # 处理Vue路由
        location / {
            try_files $uri $uri/ /index.html;
        }
        
        # API代理
        location /api/ {
            proxy_pass http://backend:8080/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
        
        # 静态资源缓存
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
}

2.4 构建和运行前端容器

构建镜像
# 构建前端镜像
docker build -t my-vue-app:latest .

# 查看镜像
docker images
运行容器
# 运行前端容器
docker run -d --name my-vue-container -p 80:80 my-vue-app:latest

# 测试访问
curl http://localhost

3. Docker Compose介绍

3.1 什么是Docker Compose

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Compose,您可以使用YAML文件来配置应用程序的服务,然后使用单个命令创建并启动所有服务。

3.2 Docker Compose的优势

  • 简化部署:一个命令启动整个应用栈
  • 环境隔离

网站公告

今日签到

点亮在社区的每一天
去签到