插件窝 干货文章 如何在Linux上使用Docker进行容器的监控和日志分析?

如何在Linux上使用Docker进行容器的监控和日志分析?

Docker 容器 Elasticsearch 监控 449    来源:    2025-04-14

Docker容器监控与日志分析指南

一、监控方案

1. 内置Docker监控命令

# 查看容器资源使用情况
docker stats [容器名/ID]

# 查看容器详细信息
docker inspect [容器名/ID]

# 查看容器进程
docker top [容器名/ID]

2. 使用cAdvisor

Google开发的容器监控工具:

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  gcr.io/cadvisor/cadvisor:latest

访问 http://localhost:8080 查看监控数据

3. Prometheus + Grafana方案

  1. 配置Docker暴露metrics:

    # 编辑或创建/etc/docker/daemon.json
    {
     "metrics-addr": "0.0.0.0:9323",
     "experimental": true
    }
    

    重启Docker:systemctl restart docker

  2. 部署Prometheus:

    docker run -d -p 9090:9090 \
     -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
     prom/prometheus
    
  3. 示例prometheus.yml配置:

    global:
     scrape_interval: 15s
    
    scrape_configs:
     - job_name: 'docker'
       static_configs:
         - targets: ['host.docker.internal:9323']
    
  4. 部署Grafana:

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

    登录后添加Prometheus数据源并导入Docker仪表板

二、日志分析方案

1. 基本日志命令

# 查看容器日志
docker logs [容器名/ID]

# 跟踪实时日志
docker logs -f [容器名/ID]

# 显示最后N行
docker logs --tail=100 [容器名/ID]

# 带时间戳显示
docker logs -t [容器名/ID]

2. 使用ELK Stack (Elasticsearch + Logstash + Kibana)

  1. 创建docker-compose.yml:

    version: '3'
    services:
     elasticsearch:
       image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
       environment:
         - discovery.type=single-node
       ports:
         - "9200:9200"
    
     kibana:
       image: docker.elastic.co/kibana/kibana:7.9.2
       ports:
         - "5601:5601"
       depends_on:
         - elasticsearch
    
     logstash:
       image: docker.elastic.co/logstash/logstash:7.9.2
       volumes:
         - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
       ports:
         - "5000:5000"
       depends_on:
         - elasticsearch
    
  2. 创建logstash.conf:

    input {
     tcp {
       port => 5000
       codec => json
     }
    }
    
    output {
     elasticsearch {
       hosts => ["elasticsearch:9200"]
     }
    }
    
  3. 启动服务:

    docker-compose up -d
    
  4. 配置Docker日志驱动:

    docker run --log-driver=syslog \
     --log-opt syslog-address=tcp://localhost:5000 \
     --log-opt tag="myapp" \
     your-application-image
    

3. 轻量级替代方案:Fluentd

# 运行Fluentd
docker run -d -p 24224:24224 -p 24224:24224/udp -v /path/to/conf:/fluentd/etc fluent/fluentd

# 配置容器使用Fluentd日志驱动
docker run --log-driver=fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="docker.{{.Name}}" your-image

三、最佳实践建议

  1. 日志管理

    • 限制日志大小:--log-opt max-size=10m --log-opt max-file=3
    • 使用JSON格式日志便于解析:--log-driver=json-file
  2. 监控优化

    • 为关键容器设置资源限制
    • 配置监控告警阈值
  3. 安全考虑

    • 限制监控端口的公开访问
    • 为监控工具设置认证
  4. 性能考虑

    • 高负载环境下考虑抽样监控
    • 日志收集时注意缓冲区设置

以上方案可根据实际环境需求和资源情况进行组合或简化使用。