Docker容器化已成为现代应用部署的标准做法。本指南将从镜像构建到生产级编排,全面介绍 Docker 容器化部署的各个环节,帮助开发者掌握多阶段构建、Compose、Kubernetes 集成与安全加固等核心技能。
镜像构建基础与多阶段构建
Docker 镜像是容器化的核心,良好的镜像应体积小、安全、可重复构建。
基础 Dockerfile 示例
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
多阶段构建
可在构建阶段使用完整环境,运行阶段仅保留必要产物,显著减小镜像体积:
# 构建阶段
FROM node:18 AS builder
WORKDIR /src
COPY . .
RUN npm ci && npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /src/dist ./dist
COPY --from=builder /src/package.json ./package.json
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]
Docker Compose 与服务编排
Compose 适合本地开发与小型部署,通过 YAML 定义多容器应用:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
支持环境变量、健康检查、网络隔离,方便一键启动整套环境。
Kubernetes 集成与生产实践
在生产环境,Kubernetes(K8s)提供弹性伸缩、自愈、滚动更新等能力。
- Pod:最小调度单元,可包含多个容器
- Deployment:声明期望副本数,自动维持状态
- Service:稳定网络入口
- Ingress:HTTP路由与SSL终结
示例 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: myrepo/web:latest
ports:
- containerPort: 3000
安全加固策略
- 使用非 root 用户运行容器
- 最小化镜像层数 & 移除调试工具
- 定期扫描镜像漏洞(Trivy、Clair)
- 启用 Seccomp、AppArmor 限制系统调用
- 避免在容器中存储敏感信息,使用 Secret 管理
⚠️ 安全提示
容器安全是持续过程,需定期扫描镜像漏洞,及时修复 CVE。
CI/CD 流水线集成
在 GitHub Actions、GitLab CI、Jenkins 中集成 Docker 构建与推送:
- name: Build and push
run: |
docker build -t myrepo/web:$GITHUB_SHA .
echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
docker push myrepo/web:$GITHUB_SHA
结合 GitOps(ArgoCD/Flux)可实现集群配置自动同步。
网络与存储管理
Docker 提供 bridge、host、overlay 等网络模式;K8s 支持 CNI 插件实现复杂拓扑。
存储方面:绑定挂载适合开发,Volume 与 PV/PVC 适合生产持久化。
监控、日志与排错
- Prometheus + Grafana 监控容器指标
- ELK/EFK 收集与分析日志
- `docker logs`、`kubectl logs` 排查问题
- `docker exec -it` / `kubectl exec` 进入容器调试
💡 最佳实践
建立完善的监控和日志体系,能快速定位和解决问题,保障服务稳定运行。