Docker容器化部署最佳实践

· 阅读约需8分钟

Docker容器化部署最佳实践

Docker已成为现代应用部署的标准方式。本文总结了生产环境中Docker容器化部署的最佳实践,帮助你构建稳定、安全、高效的容器化应用。

一、镜像构建最佳实践

选择合适的基础镜像

  • 优先使用官方镜像:安全性有保障,维护及时
  • 使用Alpine镜像:体积小,攻击面小(注意musl libc兼容性)
  • 避免latest标签:使用具体版本号,确保可复现构建

推荐基础镜像选择:

# 好:指定具体版本
FROM node:16-alpine3.15

# 不好:不指定版本
FROM node:latest

优化镜像层数

  • 合并RUN命令,减少镜像层数
  • 合理排序指令,利用构建缓存
  • 清理缓存文件,减小镜像体积

优化示例:

# 好:合并命令并清理缓存
RUN apt-get update && \
    apt-get install -y curl && \
    rm -rf /var/lib/apt/lists/*

# 不好:多层命令且不清理
RUN apt-get update
RUN apt-get install -y curl

多阶段构建

使用多阶段构建分离编译环境和运行环境:

# 构建阶段
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .

# 运行阶段
FROM alpine:3.15
COPY --from=builder /app/main /main
CMD ["/main"]

二、容器安全配置

不以root用户运行

创建普通用户运行应用:

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

只读文件系统

docker run --read-only --tmpfs /tmp myimage

限制容器能力

# 删除所有能力,只添加必要的
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myimage

安全扫描工具

  • 使用Trivy扫描镜像漏洞
  • 集成到CI/CD流水线
  • 定期更新基础镜像

三、资源限制与监控

设置资源限制

# 限制内存和CPU
docker run -m 512m --cpus=1 myimage

# 内存交换限制
docker run -m 512m --memory-swap=512m myimage

健康检查

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/health || exit 1

日志配置

docker run --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myimage

四、网络配置最佳实践

使用自定义网络

# 创建自定义网络
docker network create mynetwork

# 容器加入网络
docker run --network=mynetwork --name=web myimage
docker run --network=mynetwork --name=db mysql

不使用host网络

除非绝对必要,避免使用--network=host,破坏容器隔离性。

端口映射策略

  • 只暴露必要端口
  • 不映射22端口(SSH)
  • 使用127.0.0.1绑定内部服务

五、数据持久化

使用命名卷

# 好:命名卷,便于管理
docker run -v mydata:/data myimage

# 避免:绑定挂载主机目录
docker run -v /host/path:/data myimage

数据库数据备份策略

  1. 定期执行docker exec备份
  2. 使用卷插件实现远程备份
  3. 测试恢复流程

六、编排与部署

Docker Compose生产配置

version: '3.8'
services:
  web:
    image: myapp:1.0.0
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
      restart_policy:
        condition: on-failure
        max_attempts: 3

滚动更新策略

  • 蓝绿部署
  • 金丝雀发布
  • 确保零停机升级

七、生产环境检查清单

部署前确认:

  • 镜像已扫描无高危漏洞
  • 容器不以root用户运行
  • 设置了合理的资源限制
  • 配置了健康检查
  • 日志已正确配置
  • 敏感信息使用Secret管理
  • 数据备份方案已验证
  • 监控告警已配置

遵循这些最佳实践,你的Docker容器化部署将更加稳定、安全、高效。