哈喽,大家好,我是左手python!
监控工具与方法
系统资源监控
在容器化应用中,系统资源监控是确保应用稳定运行的基础。Docker 提供了多种工具和方法来监控容器的资源使用情况。
使用 docker stats
监控容器资源
docker stats
是 Docker 官方提供的一个简单 yet powerful 工具,用于实时监控容器的 CPU、内存、网络和 I/O 使用情况。以下是 docker stats
的基本使用方法:
# 监控所有运行中的容器
docker stats
# 监控指定容器
docker stats <container_name>
# 监控容器的 CPU 使用情况
docker stats --no-stream --format "{{.CPUPerc}}" <container_name>
使用 cAdvisor 监控容器性能
cAdvisor 是 Google 开源的一个容器资源监控工具,支持 Docker、Rocket 等多种容器运行时。cAdvisor 提供了详细的资源使用情况,包括 CPU、内存、网络和磁盘 I/O。
# 使用 Docker运行 cAdvisor
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run/docker.sock:/var/run/docker.sock:rw \
--publish=8080:8080 \
--detach=true \
google/cadvisor:latest
访问 http://localhost:8080
即可查看容器的资源使用情况。
集成 Prometheus 和 Grafana
Prometheus 是一个开源的监控和警报工具,广泛应用于容器化环境中。结合 Grafana,可以实现数据可视化。
# prometheus.yml 配置文件
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['localhost:8080']
# 运行 Prometheus
docker run -d --name prometheus -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:latest
应用性能监控
除了系统资源监控,应用性能监控同样重要。通过监控应用的关键指标,可以及时发现潜在问题。
使用 Docker 日志监控应用
Docker 提供了日志驱逐(logging driver)功能,可以将容器日志输出到指定的位置,方便后续分析。
# 配置 Docker 使用 json-file 日志驱逐
docker run -it --log-driver json-file --log-opt path=/var/lib/docker/containers/<container_id>/<container_id>-json.log <image_name>
集成 ELK 堆栈
ELK 堆栈(Elasticsearch、Logstash、Kibana)是一套功能强大的日志管理工具。
# 使用 Docker Compose 运行 ELK 堆栈
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
environment:
- xpack.security.enabled=false
ports:
- "9200:9200"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:7.10.2
ports:
- "5000:5000"
volumes:
- ./logstash.conf:/etc/logstash/conf.d/logstash.conf
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:7.10.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
volumes:
elasticsearch_data:
分布式追踪
在微服务架构中,分布式追踪是理解请求调用链路的重要工具。
使用 Jaeger 进行分布式追踪
Jaeger 是一个开源的分布式追踪系统,支持多种协议和集成方式。
# 使用 Docker 运行 Jaeger
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 9411:9411 \
jaegertracing/all-in-one:latest
访问 http://localhost:16686
即可查看分布式追踪信息。
日志管理与分析
Docker 日志驱逐
Docker 支持多种日志驱逐方式,包括 json-file、syslog、journald 等。
配置 json-file 日志驱逐
# Docker daemon 配置文件
{
"log-driver": "json-file",
"log-opts": {
"labels": "com.example.labels",
"env": "os,customer"
}
}
配置 syslog 日志驱逐
# Docker daemon 配置文件
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "tcp://localhost:514",
"syslog-facility": "daemon"
}
}
日志轮转与管理
容器日志文件会随着时间增长,需要定期轮转和清理。
使用 logrotate 管理日志
# logrotate 配置文件
/var/lib/docker/containers/*/*.log {
daily
missingok
notifempty
delaycompress
compress
maxsize 100M
maxage 7
postrotate
/usr/bin/docker kill -s SIGUSR1
endscript
}
故障排查指南
容器运行时故障
容器启动失败
- 检查容器日志
docker logs <container_name>
- 检查 Docker 守护进程日志
journalctl -u docker.service --since "10 minutes ago"
- 检查端口冲突
netstat -tuln | grep <port>
容器无法连接网络
- 检查 Docker 网络配置
docker network inspect <network_name>
- 检查容器网络接口
docker exec <container_name> ip a
- 检查防火墙规则
iptables -L -n
应用内部故障
应用配置错误
- 检查配置文件
docker exec <container_name> cat /path/to/config/file
- 检查环境变量
docker exec <container_name> printenv
- 检查应用日志
docker logs <container_name>
应用依赖缺失
- 检查容器内的依赖项
docker exec <container_name> dpkg -l
- 检查 Docker 镜像的依赖项
docker image inspect --format '{{.Config.Env}}' <image_name>
资源过载问题
CPU 使用过高
- 检查容器 CPU 使用情况
docker stats --format "{{.Name}} {{.CPUPerc}}" <container_name>
- 优化应用代码
- 调整资源限制
docker update --cpuset-cpus 0-1 <container_name>
内存使用过高
- 检查容器内存使用情况
docker stats --format "{{.Name}} {{.MemUsage}}" <container_name>
- 优化应用内存使用
- 调整内存限制
docker update --memory 2g <container_name>