Docker容器化部署最佳实践
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数据库数据备份策略
- 定期执行
docker exec备份 - 使用卷插件实现远程备份
- 测试恢复流程
六、编排与部署
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容器化部署将更加稳定、安全、高效。