Docker核心概念

Docker通过容器化技术实现应用的轻量级虚拟化。理解三个核心概念是掌握Docker的基础:镜像(Image)、容器(Container)和仓库(Registry)。

镜像是一个只读模板,包含运行应用所需的全部文件;容器是镜像的运行实例;仓库用于存储和分发镜像。

Dockerfile编写技巧

基础镜像选择

选择合适的基础镜像对安全和性能至关重要:

  • Alpine:5MB左右,最小化镜像,但兼容性较差
  • Slim:Debian的精简版,兼容性好
  • Distroless:Google维护,只包含运行时依赖

多阶段构建

多阶段构建是减小镜像体积的最佳实践:

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

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

通过这种方式,可以将Golang应用的镜像从1GB以上减小到20MB左右。

层优化

  • 将不变的操作放在Dockerfile前面
  • 合并RUN指令减少层数
  • 使用.dockerignore排除不必要的文件

Docker Compose编排

Docker Compose用于定义和运行多容器应用:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
volumes:
  pgdata:

生产环境最佳实践

安全加固

  • 使用非root用户运行容器
  • 限制容器资源使用(CPU、内存)
  • 定期扫描镜像漏洞(Trivy、Snyk)
  • 启用容器运行时的安全选项

日志管理

容器应输出日志到stdout/stderr,由Docker日志驱动统一收集。生产环境推荐使用json-file驱动并配合日志轮转:

docker run --log-opt max-size=10m --log-opt max-file=3 myapp

监控与健康检查

在Dockerfile中定义健康检查指令:

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

Docker的价值在于标准化应用的构建、分发和部署流程,掌握这些核心实践能显著提升开发和运维效率。