单体app快速docker部署

第1步:准备应用程序构建产物

npm run build
在项目下生成一个 dist 目录,里面包含了 index.html 以及相关的CSS、JS等静态资源。


mvn clean package -DskipTests
在 target (Maven) 目录下生成一个可执行的 .jar 文件,例如 yourapp-0.0.1-SNAPSHOT.jar。


第2步:创建部署目录结构

my-app-docker/
├── backend/
│   └── app.jar          # <--- 将您的Spring Boot jar包放在这里并重命名
├── frontend/
│   └── ...              # <--- 将Vite项目dist目录下的所有内容复制到这里
├── nginx.conf           # <--- Nginx 配置文件 (稍后创建)
├── start.sh             # <--- 启动脚本 (稍后创建)
└── Dockerfile           # <--- Dockerfile (稍后创建)

第3步:配置 Nginx (nginx.conf)

# 工作进程数,通常设置为CPU核心数
worker_processes  auto;

# 错误日志和进程ID文件
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

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;

    sendfile        on;
    keepalive_timeout  65;

    # Gzip 压缩,优化前端性能
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 5;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/json;

    server {
        # 容器内部监听80端口
        listen 80;
        server_name localhost;

        # 前端静态文件的根目录
        location / {
            root   /app/frontend; # Dockerfile中会将前端文件复制到这个目录
            index  index.html index.htm;
            try_files $uri $uri/ /index.html; # 对于SPA应用很重要,避免刷新404
        }
        
        # API请求的反向代理
        # 所有/api/开头的请求都会被转发
        location /api/ {
            # 转发到同一容器内运行在8080端口的Spring Boot服务
            # 使用localhost因为它们在同一个容器的网络命名空间里
            proxy_pass http://localhost: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;
        }

        # 处理服务器错误
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

第4步:创建启动脚本 (start.sh)

#!/bin/sh
# my-app-docker/start.sh

# 启动 Spring Boot 应用
# 使用 nohup 和 & 使其在后台运行,并将日志输出到文件
echo "Starting Spring Boot application..."
nohup java -jar /app/backend/app.jar > /var/log/spring-boot-app.log 2>&1 &

# 启动 Nginx
# 使用 'daemon off;' 指令让 Nginx 在前台运行
# 这是Docker容器中的关键,确保容器不会在启动后立即退出
echo "Starting Nginx..."
nginx -g 'daemon off;'

第5步:编写 Dockerfile

# my-app-docker/Dockerfile

# --- 基础镜像 ---
# 选择一个包含Java运行环境的轻量级镜像,例如OpenJDK 17
FROM openjdk:17-slim

# 作者信息
LABEL maintainer="xxx@xxx.com"

# --- 安装Nginx ---
RUN sed -i 's|http://deb.debian.org|https://mirrors.aliyun.com|g' /etc/apt/sources.list && \
    sed -i 's|http://security.debian.org|https://mirrors.aliyun.com|g' /etc/apt/sources.list

# 在基础镜像上安装Nginx
RUN apt-get update && \
    apt-get install -y nginx && \
    rm -rf /var/lib/apt/lists/*

# --- 复制文件 ---
# 创建工作目录
WORKDIR /app

# 复制后端jar包
COPY backend/ /app/backend/
# 复制前端静态文件
COPY frontend/ /app/frontend/
# 复制Nginx配置文件
COPY nginx.conf /etc/nginx/nginx.conf
# 复制并授权启动脚本
COPY start.sh /app/start.sh
RUN chmod +x /app/start.sh

# --- 配置 ---
# 创建Nginx和Spring Boot的日志目录
RUN mkdir -p /var/log/nginx && \
    touch /var/log/spring-boot-app.log && \
    chown -R www-data:www-data /var/log/nginx

# --- 暴露端口 ---
# Nginx将监听80端口,我们将这个端口暴露出去
# Spring Boot的8080端口只在容器内部访问,无需暴露
EXPOSE 80

# --- 启动命令 ---
# 容器启动时执行启动脚本
CMD ["/app/start.sh"]

第6步:在Ubuntu上构建和运行

docker build -t my-app:1.0 .

docker run -d -p 8080:80 --name my-running-app my-app:1.0

# 查看容器的合并输出 (start.sh的echo)
docker logs my-running-app

# 进入容器内部查看详细日志
docker exec -it my-running-app /bin/bash

# 进入容器后,可以查看Nginx和Spring Boot的日志
# cat /var/log/nginx/access.log
# cat /var/log/nginx/error.log
# cat /var/log/spring-boot-app.log
posted @ 2025-07-05 15:43  fhyxzmkh  阅读(27)  评论(0)    收藏  举报