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