使用Docker部署Vendure电商系统的完整指南
前言
在现代应用部署中,容器化技术已经成为标准实践。本文将详细介绍如何使用Docker容器化部署Vendure电商系统,包括基础Docker部署、Docker Compose编排以及Kubernetes集群部署方案。
Docker基础部署
理解Dockerfile
Vendure提供的默认Dockerfile采用了多阶段构建策略,确保生产环境的最佳实践:
FROM node:22
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production
COPY . .
RUN npm run build
这个Dockerfile执行了以下关键步骤:
- 基于Node.js 22官方镜像构建
- 设置工作目录
- 仅复制package.json和package-lock.json文件
- 安装生产依赖(避免开发依赖增大镜像体积)
- 复制源代码并执行构建
构建与运行容器
构建镜像命令:
docker build -t vendure .
运行服务器和Worker:
# 运行服务器
docker run -dp 3000:3000 --name vendure-server vendure npm run start:server
# 运行Worker
docker run -dp 3000:3000 --name vendure-worker vendure npm run start:worker
参数说明:
-d
:后台运行模式-p 3000:3000
:端口映射(容器端口:主机端口)--name
:为容器指定易记名称
使用Docker Compose编排
对于生产环境,我们通常需要管理多个服务(应用服务器、Worker、数据库等)。Docker Compose提供了便捷的编排方式。
典型docker-compose.yml配置
version: "3.8"
services:
server:
build: .
ports:
- "3000:3000"
command: ["npm", "run", "start:server"]
environment:
DB_HOST: database
DB_PORT: 5432
DB_NAME: vendure
DB_USERNAME: postgres
DB_PASSWORD: password
depends_on:
- database
worker:
build: .
command: ["npm", "run", "start:worker"]
environment:
DB_HOST: database
DB_PORT: 5432
DB_NAME: vendure
DB_USERNAME: postgres
DB_PASSWORD: password
depends_on:
- database
database:
image: postgres:13
volumes:
- pg_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: vendure
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
pg_data:
关键改进点:
- 添加了数据库健康检查
- 使用命名卷持久化数据库
- 明确服务依赖关系
- 指定PostgreSQL版本
Kubernetes部署方案
对于大规模生产环境,Kubernetes提供了更强大的容器编排能力。
基础部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: vendure-deployment
spec:
replicas: 3
selector:
matchLabels:
app: vendure
template:
metadata:
labels:
app: vendure
spec:
containers:
- name: server
image: vendure-shop:latest
ports:
- containerPort: 3000
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 5
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
envFrom:
- configMapRef:
name: vendure-config
- name: worker
image: vendure-shop:latest
envFrom:
- configMapRef:
name: vendure-config
服务暴露配置
apiVersion: v1
kind: Service
metadata:
name: vendure-service
spec:
selector:
app: vendure
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
健康检查机制
服务器健康检查
Vendure服务器内置健康检查端点:
GET /health
典型响应:
{
"status": "ok",
"info": {
"database": {
"status": "up"
}
}
}
Worker健康检查
Worker需要显式启用健康检查服务器:
bootstrapWorker(config)
.then(worker => worker.startJobQueue())
.then(worker => worker.startHealthCheckServer({ port: 3020 }))
.catch(err => {
console.log(err);
});
检查端点:
GET http://worker-host:3020/health
最佳实践建议
-
镜像优化:
- 使用多阶段构建减少镜像体积
- 定期更新基础镜像获取安全补丁
-
配置管理:
- 使用环境变量管理敏感信息
- 考虑使用Kubernetes Secrets或Docker secrets
-
持久化存储:
- 数据库数据必须持久化
- 考虑备份策略
-
监控:
- 集成Prometheus监控
- 设置适当的告警规则
-
扩展性:
- 根据负载动态调整实例数量
- 考虑分离服务器和Worker的扩展策略
通过以上方案,您可以构建一个稳定、可扩展的Vendure电商系统容器化部署架构,满足从开发到生产各种环境的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考