文章摘要

这篇文章详细介绍了Docker容器的日志和监控方法。内容包括如何使用docker logs命令查看容器日志、配置不同的日志驱动以将日志发送到指定的存储后端,以及如何处理和管理日志文件。文章还介绍了几种常见的监控工具和方法,如Docker自带的监控命令、cAdvisor、Prometheus和Grafana,帮助读者监控容器的资源使用情况和性能指标。通过实例和命令行示例,文章帮助读者深入理解和掌握Docker容器的日志管理和监控技术。整体内容适合初学者和有一定基础的用户参考学习。

日志

Docker 容器的日志是了解容器运行状态、调试问题和监控应用的重要工具。Docker 提供了多种日志驱动,用于收集和存储容器的日志信息。以下是对 Docker 容器日志的详细介绍,包括日志驱动、日志查看方法、日志配置和最佳实践。

日志驱动

Docker 支持多种日志驱动,用于将容器的标准输出(stdout)和标准错误(stderr)日志收集并存储到不同的目标位置。常见的日志驱动包括:

  1. json-file:默认日志驱动,将日志存储在 JSON 文件中。
  2. syslog:将日志发送到 syslog 服务。
  3. journald:将日志发送到 journald 服务。
  4. gelf:将日志发送到 Graylog Extended Log Format (GELF) 兼容的日志服务器。
  5. fluentd:将日志发送到 Fluentd 服务。
  6. awslogs:将日志发送到 Amazon CloudWatch Logs。
  7. splunk:将日志发送到 Splunk。
  8. none:禁用日志记录。
# 查看容器日志
docker logs my-container
# 使用 -f 选项可以实时查看容器的日志
docker logs -f my-container

编辑 Docker 守护进程配置文件(通常是 /etc/docker/daemon.json),设置默认日志驱动

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

重新启动 Docker 守护进程以应用配置

sudo systemctl restart docker

日志管理最佳实践

1. 集中管理日志

使用集中化的日志管理工具(如 ELK Stack、Fluentd、Graylog)收集和分析容器日志,方便故障排除和审计。

2. 配置日志轮转

配置日志轮转(log rotation)以防止日志文件占用过多磁盘空间。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

3. 使用合适的日志驱动

根据应用需求选择合适的日志驱动。例如,使用 awslogs 将日志发送到 Amazon CloudWatch Logs,使用 fluentd 将日志发送到 Fluentd 服务。

4. 实时监控日志

使用 docker logs -f 命令实时监控容器日志,及时发现和解决问题。

5. 设置告警

配置告警规则,当日志中出现特定关键字或错误信息时,发送告警通知,及时响应和处理问题。

监控

常见的容器监控工具

  1. cAdvisor:一个开源工具,用于收集和监控容器的资源使用情况。
  2. Prometheus:一个开源的监控系统和时间序列数据库,常与 Grafana 结合使用。
  3. Grafana:一个开源的分析和监控平台,用于可视化数据和设置告警。
  4. ELK Stack:Elasticsearch、Logstash 和 Kibana 的组合,用于日志收集、分析和可视化。
  5. Fluentd:一个开源的数据收集器,用于日志收集和传输。
  6. Nagios:一个开源的系统监控工具,支持容器监控和告警。

使用 cAdvisor 监控容器

cAdvisor(Container Advisor)是一个开源工具,用于收集和监控容器的资源使用情况。

运行 cAdvisor

你可以使用 Docker 运行 cAdvisor 容器。

docker run -d --name=cadvisor -p 8080:8080 \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  google/cadvisor:latest

访问 http://localhost:8080 可以查看 cAdvisor 提供的监控界面。

使用 Prometheus 和 Grafana 监控容器

Prometheus 是一个开源的监控系统和时间序列数据库,Grafana 是一个开源的分析和监控平台。它们常常结合使用,用于监控和可视化容器的运行状态和性能指标。

运行 Prometheus

创建一个 Prometheus 配置文件 prometheus.yml,配置 cAdvisor 作为数据源。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

运行 Prometheus 容器。

docker run -d --name=prometheus -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

访问 http://localhost:9090 可以查看 Prometheus 提供的监控界面。

运行 Grafana

运行 Grafana 容器。

docker run -d --name=grafana -p 3000:3000 grafana/grafana

访问 http://localhost:3000 可以查看 Grafana 提供的监控界面。你可以在 Grafana 中添加 Prometheus 作为数据源,并创建监控仪表盘。

设置告警

告警是监控系统的重要组成部分,当监控指标超过预设的阈值时,告警系统会发送通知,提醒你及时处理问题。

使用 Prometheus Alertmanager 设置告警

Prometheus Alertmanager 是一个用于处理告警的组件,可以接收来自 Prometheus 的告警,并根据配置发送通知。

1. 创建 Alertmanager 配置文件

创建一个 Alertmanager 配置文件 alertmanager.yml

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 3h
  receiver: 'email'

receivers:
  - name: 'email'
    email_configs:
      - to: 'your-email@example.com'
        from: 'alertmanager@example.com'
        smarthost: 'smtp.example.com:587'
        auth_username: 'your-email@example.com'
        auth_password: 'your-email-password'
2. 运行 Alertmanager

运行 Alertmanager 容器。

docker run -d --name=alertmanager -p 9093:9093 \
  -v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager
3. 配置 Prometheus 发送告警到 Alertmanager

修改 Prometheus 配置文件 prometheus.yml,添加 Alertmanager 配置。

global:
  scrape_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 'alertmanager:9093'

scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

rule_files:
  - 'alert.rules'
4. 创建告警规则

创建一个告警规则文件 alert.rules

groups:
  - name: example
    rules:
      - alert: HighCPUUsage
        expr: sum(rate(container_cpu_usage_seconds_total[1m])) by (container_label_com_docker_swarm_service_name) > 0.8
        for: 1m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage detected"
          description: "CPU usage is above 80% for more than 1 minute."
5. 重新启动 Prometheus

重新启动 Prometheus 容器以应用新的配置。

docker stop prometheus
docker rm prometheus
docker run -d --name=prometheus -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v $(pwd)/alert.rules:/etc/prometheus/alert.rules \
  prom/prometheus

日志监控

除了监控资源使用情况,日志监控也是确保容器化应用稳定运行的重要手段。以下是一些常见的日志监控工具和方法。

使用 ELK Stack 进行日志监控

ELK Stack 由 Elasticsearch、Logstash 和 Kibana 组成,用于日志收集、分析和可视化。

1. 运行 Elasticsearch

运行 Elasticsearch 容器。

docker run -d --name=elasticsearch -p 9200:9200 -p 9300:9300 \  -e "discovery.type=single-node" \  elasticsearch:7.10.1
2. 运行 Logstash

创建一个 Logstash 配置文件 logstash.conf

input {
  beats {
    port => 5044
  }
}

filter {
  json {
    source => "message"
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "docker-logs-%{+YYYY.MM.dd}"
  }
}

运行 Logstash 容器。

docker run -d --name=logstash -p 5044:5044 \
  -v $(pwd)/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
  logstash:7.10.1
3. 运行 Kibana

运行 Kibana 容器。

docker run -d --name=kibana -p 5601:5601 \
  --link elasticsearch:elasticsearch \
  kibana:7.10.1

访问 http://localhost:5601 可以查看 Kibana 提供的日志可视化界面。

最佳实践

1. 集中管理日志和监控数据

使用集中化的日志和监控管理工具(如 ELK Stack、Prometheus、Grafana)收集和分析容器日志和监控数据,方便故障排除和审计。

2. 配置告警规则

配置告警规则,当监控指标超过预设的阈值时,发送告警通知,及时响应和处理问题。

3. 定期检查和优化监控配置

定期检查和优化监控配置,确保监控系统的高效运行和准确性。

4. 使用合适的监控工具

根据应用需求选择合适的监控工具。例如,使用 Prometheus 和 Grafana 监控资源使用情况,使用 ELK Stack 监控日志。