从写好代码到上线运行,中间隔着一道"部署"的鸿沟。本文将串联 Docker 容器化、Nginx 反向代理和 Serverless 平台部署,形成一条完整的现代化部署链路。
Dockerfile 最佳实践:多阶段构建
# 阶段 1:构建阶段
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B # 利用 Docker 缓存层
COPY src ./src
RUN mvn package -DskipTests -B
# 阶段 2:运行阶段(更小的镜像)
FROM eclipse-temurin:21-jre-alpine
RUN apk add --no-cache curl # 健康检查工具
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
RUN addgroup -S app && adduser -S app -G app
USER app
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-jar", "app.jar"]多阶段构建的好处:最终镜像只包含 JRE 和 JAR(约 200MB),而非带 Maven 和源码的构建环境(1GB+)。分层缓存——pom.xml 单独 COPY,依赖下载被缓存,代码改动时无需重新下载依赖。
Docker Compose 本地编排
# docker-compose.yml
services:
nginx:
image: nginx:alpine
ports: ["80:80", "443:443"]
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on: [backend]
backend:
build: .
environment:
- SPRING_PROFILES_ACTIVE=docker
depends_on: [mysql, redis]
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myblog
volumes: [mysql_data:/var/lib/mysql]
redis:
image: redis:7-alpine
volumes: [redis_data:/data]
volumes:
mysql_data:
redis_data:Nginx 反向代理:核心配置
# nginx.conf
upstream backend {
server backend1:8080 weight=3;
server backend2:8080 weight=1;
keepalive 32;
}
server {
listen 80;
server_name blog.example.com;
return 301 https://$host$request_uri; # HTTP 强制跳转 HTTPS
}
server {
listen 443 ssl http2;
server_name blog.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
# API 代理
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态资源(Nginx 直接处理,不经过后端)
location /static/ {
root /var/www/html;
expires 30d;
add_header Cache-Control "public, immutable";
}
}Serverless 平台快速上线
# 阿里云 Serverless 应用引擎(SAE)配置
edition: 3.0.0
name: my-app
resources:
backend:
component: aliyun_sae
props:
namespace_id: cn-hangzhou:prod
app_name: my-backend
cpu: 2
memory: 4
replicas: 3
package:
type: image
image: registry.cn-hangzhou.aliyuncs.com/myapp/backend:latest
sls_conf:
enable: true
auto_config: trueServerless vs 传统部署:消除服务器运维、按需付费、弹性伸缩秒级扩容。
总结
Docker 解决了"环境一致性"问题,Nginx 解决了"流量入口"问题,Serverless 解决了"运维效率"问题。三者结合:Dockerfile 定义环境 → Docker Compose 本地编排 → CI/CD 自动构建镜像 → Serverless 平台一键部署。
评论 (0)