容器化技术已经深入人心,但在实际生产环境中,Docker 的使用远非 docker run 那么简单。本文总结了在多个项目中踩过的坑,以及相应的最佳实践。
多阶段构建的重要性
很多开发者在构建镜像时,直接将源码和构建产物一起打包,导致镜像体积膨胀。正确的做法是使用多阶段构建,最终只保留编译后的二进制文件。
# 错误的单阶段构建
FROM golang:1.21
WORKDIR /app
COPY . .
RUN go build -o main
CMD ["./main"]
# 正确的多阶段构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o main
FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["./main"]
健康检查不能少
在生产环境中,必须配置健康检查。这不仅能让容器编排系统及时发现问题,还能在滚动更新时确保服务的稳定性。
资源限制的设置
没有设置资源限制的容器可能会耗尽宿主机的资源。建议始终为每个容器设置 CPU 和内存限制。