1. 基础部署流程
准备 Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
构建和运行容器
# 构建镜像
docker build -t my-app .
# 运行容器
docker run -d -p 3000:3000 --name my-app-container my-app
# 查看运行中的容器
docker ps
# 查看日志
docker logs my-app-container
2. 使用 Docker Compose(推荐)
创建 docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
运行命令:
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
3. 生产环境部署最佳实践
多阶段构建
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 运行阶段
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --chown=nextjs:nodejs . .
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
使用 .dockerignore
node_modules
npm-debug.log
.git
.env
Dockerfile
README.md
4. 容器编排部署
使用 Docker Swarm
# 初始化 Swarm
docker swarm init
# 部署堆栈
docker stack deploy -c docker-compose.yml myapp
使用 Kubernetes
创建 deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
5. 环境特定配置
使用环境变量
# 通过环境变量配置
docker run -d \
-e DATABASE_URL=postgresql://user:pass@db:5432/myapp \
-e REDIS_URL=redis://redis:6379 \
my-app
配置文件挂载
# 挂载配置文件
docker run -d \
-v $(pwd)/config:/app/config \
-p 3000:3000 \
my-app
6. 监控和日志
# 查看容器资源使用
docker stats
# 查看详细日志
docker logs -f my-app-container
# 进入容器调试
docker exec -it my-app-container sh
7. 持续集成/持续部署
GitHub Actions 示例
name: Build and Deploy
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t my-app .
- name: Deploy to server
run: |
docker-compose pull
docker-compose up -d
部署检查清单
- Dockerfile 优化(多阶段构建、最小基础镜像)
- 安全扫描镜像漏洞
- 配置正确的资源限制
- 设置日志轮转策略
- 配置健康检查
- 备份和恢复策略
- 监控和告警设置