进销存系统 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 的机器,交付结果都和测试环境一模一样。配合 技术架构选型 中前后端分离的结构,客户现场出问题,研发在本机能复现九成。