单体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

浙公网安备 33010602011771号