1. Docker 技术全景解析
Docker 作为现代应用容器化的标杆技术,本质上是通过操作系统级虚拟化实现的进程隔离方案。与传统虚拟机相比,它的轻量性体现在直接共享宿主机内核,通过命名空间(Namespace)实现资源隔离,通过控制组(CGroup)实现资源限制,通过联合文件系统(UnionFS)实现分层镜像。这种架构使得容器启动时间可以控制在毫秒级,而内存开销仅为传统虚拟机的1/10。
典型应用场景包括:
- 开发环境标准化(解决"在我机器上能跑"问题)
- CI/CD 流水线构建(每个构建步骤独立容器化)
- 微服务部署(服务隔离与资源控制)
- 混合云迁移(消除环境差异)
关键认知:容器不是迷你虚拟机,而是被严格管控的进程集合。理解这点能避免很多使用误区。
2. 微服务架构的容器化适配
2.1 服务拆分原则
微服务容器化需要遵循"一个容器一个进程"原则,这意味着:
- 每个业务服务独立打包为镜像
- 辅助服务(如Redis、MySQL)单独容器化
- 禁止使用SSH管理容器(违背不可变基础设施原则)
2.2 容器网络设计
Docker 提供多种网络模式,微服务场景推荐:
bash复制# 创建自定义桥接网络
docker network create --driver bridge --subnet 172.28.0.0/16 micro-net
优势包括:
- 自动服务发现(通过容器名互访)
- 独立于宿主机网络的安全隔离
- 支持网络别名和负载均衡
3. 实战:电商系统容器化
3.1 镜像构建最佳实践
以订单服务为例的Dockerfile:
dockerfile复制FROM openjdk:17-jdk-slim AS builder
WORKDIR /app
COPY . .
RUN ./gradlew bootJar
FROM openjdk:17-jdk-slim
COPY --from=builder /app/build/libs/order-service-*.jar /app/order-service.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/order-service.jar"]
构建优化技巧:
- 多阶段构建减少最终镜像体积(上例从1.2GB缩减到187MB)
- 使用.dockerignore排除无关文件
- 固定基础镜像版本(避免自动更新导致异常)
3.2 编排部署方案
使用docker-compose.yml管理服务依赖:
yaml复制version: '3.8'
services:
order-service:
build: ./order-service
networks:
- micro-net
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
redis:
image: redis:alpine
networks:
- micro-net
volumes:
- redis_data:/data
networks:
micro-net:
external: true
volumes:
redis_data:
4. 生产环境调优指南
4.1 资源限制策略
通过cgroup实现精准控制:
bash复制docker run -it --cpus=0.5 --memory=500m --pids-limit=100 my-service
关键参数经验值:
- CPU份额:交易类服务0.5核,计算密集型2核
- 内存限制:JVM服务需预留20%余量
- 文件描述符:默认1024需调高(--ulimit nofile=65535:65535)
4.2 日志管理方案
推荐配置:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production"
}
}
配合ELK栈实现:
- Filebeat收集容器日志
- Logstash添加业务标签
- Elasticsearch建立按服务分片的索引
5. 故障排查手册
5.1 性能问题定位
诊断命令组合:
bash复制# 查看容器资源使用
docker stats --no-stream
# 进入容器分析进程
docker exec -it my-container /bin/sh
top -H -p 1
# 网络延迟检测
docker run --rm --net=container:my-container nicolaka/netshoot \
ping -c 4 database
5.2 典型异常处理
- 启动失败:检查ENTRYPOINT是否阻塞(需前台运行)
- 内存溢出:结合jmap分析JVM堆转储
- 网络不通:验证iptables规则和网络策略
- 存储挂载:检查volume权限(特别是SELinux环境)
6. 进阶部署架构
6.1 集群化方案选型
对比主流编排平台:
| 特性 | Docker Swarm | Kubernetes | Nomad |
|---|---|---|---|
| 学习曲线 | ★★☆ | ★★★ | ★★☆ |
| 扩展性 | ★★☆ | ★★★ | ★★★ |
| 社区生态 | ★★☆ | ★★★ | ★★☆ |
| 部署速度 | ★★★ | ★★☆ | ★★★ |
中小团队推荐Swarm入门:
bash复制# 初始化集群
docker swarm init --advertise-addr 192.168.1.100
# 部署服务栈
docker stack deploy -c docker-compose.prod.yml ecommerce
6.2 服务网格集成
通过Linkerd实现服务间通信可观测性:
- 安装mesh组件:
bash复制curl -sL https://run.linkerd.io/install | sh
linkerd install | kubectl apply -f -
- 注入sidecar容器:
bash复制kubectl get deploy -n my-app -o yaml | linkerd inject - | kubectl apply -f -
- 监控黄金指标:
- 请求成功率
- 延迟百分位
- 流量饱和度
7. 安全加固实践
7.1 镜像扫描策略
使用Trivy进行漏洞检测:
bash复制docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image my-service:latest
处理原则:
- 高危漏洞必须修复
- 中危漏洞评估影响范围
- 低危漏洞记录豁免原因
7.2 运行时防护
关键安全配置:
bash复制docker run --security-opt no-new-privileges \
--read-only \
--tmpfs /tmp:rw,size=50M \
my-service
补充措施:
- 定期轮换TLS证书
- 启用容器行为监控(如Falco)
- 限制docker.sock访问权限
8. 监控体系搭建
8.1 指标采集方案
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['192.168.1.100:9323']
配合Grafana仪表盘监控:
- 容器内存/CPU使用率
- 网络I/O吞吐量
- 存储空间水位
8.2 告警规则设计
典型触发条件:
- 容器重启次数(rate(restarts_total[5m]) > 0)
- OOMKill事件计数增加
- 健康检查连续失败
- 证书过期时间<7天
9. 持续交付流水线
9.1 镜像构建优化
使用BuildKit加速构建:
bash复制export DOCKER_BUILDKIT=1
docker build --ssh default --secret id=aws,src=./.aws/credentials .
特性支持:
- 并行构建阶段
- 缓存智能复用
- 密钥安全管理
9.2 滚动更新策略
蓝绿部署示例:
bash复制docker service update --image my-service:v2 \
--update-parallelism 2 \
--update-delay 10s \
--update-order start-first \
order-service
验证无误后清理旧版本:
bash复制docker image prune --filter "until=24h"
10. 遗留系统迁移技巧
10.1 单体应用容器化
分步骤改造:
- 提取配置为环境变量
- 将日志输出到stdout
- 外部化状态存储(Redis/DB)
- 添加健康检查端点
- 构建Docker镜像
10.2 混合架构管理
通过Docker API实现统一管控:
python复制import docker
client = docker.DockerClient(base_url='unix://var/run/docker.sock')
def scale_service(service_name, replicas):
service = client.services.get(service_name)
service.scale(replicas)
注意事项:
- API版本兼容性
- TLS证书配置
- 请求限流保护