进销存系统 Docker 部署指南

进销存系统卖给客户,部署方式决定了交付成本:环境装一整天和一条命令起全套,是完全不同的生意。Docker 把运行环境整体打包,新客户的服务器上只要装好 Docker,几分钟就能跑起整套系统。本文记录我们 Web 版进销存的标准化 Docker 部署方案。

一、整体结构:三个容器

最小可用部署由三个容器组成:

容器 镜像 职责
nginx nginx:alpine 对外唯一入口:静态资源 + 反代 API + HTTPS 终结
backend 自构建(运行时 JDK / Node) 进销存业务 API
db mysql:8 或 postgres:16 业务数据库,数据卷持久化

前端资源直接打进 nginx 镜像,不经后端中转,首屏速度最好。三个容器用 docker-compose 编排成一个文件交付,客户环境只需要 docker compose up -d。

二、前端镜像:多阶段构建

前端用多阶段构建,最终镜像只含构建产物和 nginx,体积通常在 30MB 以内:

# 阶段一:构建
FROM node:20-alpine AS build
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build

# 阶段二:运行
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

关键点:依赖安装和源码拷贝分层,锁文件不变时依赖层走构建缓存,改代码不用重装依赖,构建速度差十倍以上。

三、nginx 配置:一份文件管三件事

前端容器内的 nginx 承担静态服务、API 反代和路由回退:

server {
  listen 80;
  gzip on;
  gzip_types text/css application/javascript application/json;

  location / {
    root /usr/share/nginx/html;
    try_files $uri $uri/ /index.html;   # SPA 路由回退
    expires 7d;                          # 静态资源缓存
  }

  location /api/ {
    proxy_pass http://backend:8080/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    client_max_body_size 20m;            # 单据附件上传
  }
}

带 content hash 的 JS/CSS 文件可以配一年缓存,HTML 永不缓存。这台 nginx 不直接对公网暴露时,HTTPS 由外层网关或宿主机 nginx 终结;直接暴露就用 certbot 挂证书。

四、compose 编排与数据持久化

services:
  nginx:
    build: .
    ports: ["80:80", "443:443"]
    depends_on: [backend]
  backend:
    image: registry.example.com/jxc-backend:1.4.0
    environment:
      DB_URL: jdbc:mysql://db:3306/jxc
    depends_on: [db]
  db:
    image: mysql:8
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: jxc

volumes:
  db_data:

数据库数据必须放命名卷,绝不能依赖容器层文件。生产环境再把数据卷挂到宿主机的定期备份脚本上,每日全量 + binlog 增量,保留 30 天。备份不做,等于没部署。

五、升级与回滚

镜像版本固定、compose 文件里写死版本号,升级就是改版本号加两条命令:

docker compose pull && docker compose up -d
# 出问题回滚:改回旧版本号重复上述命令

数据库结构变更用迁移工具管理(Flyway / Liquibase / Prisma migrate),镜像启动时自动执行,保证任何版本的应用配上对应版本的库结构。回滚时迁移脚本要有配套的 down 脚本,或干脆设计为只做兼容式变更(加列不加删列)。

六、现场交付清单

给客户交付时随 compose 文件附一页 README:服务器最低配置(2C4G 起步)、需要开放的端口、初始化管理员账号、备份脚本用法、常见排错命令(docker compose logs -f、docker compose ps)。这页纸能省下大量远程支持时间。

结语

Docker 部署进销存的价值不在技术多先进,而在交付可复制:任何一台装了 Docker 的机器,交付结果都和测试环境一模一样。配合 技术架构选型 中前后端分离的结构,客户现场出问题,研发在本机能复现九成。