20、Docker容器监控全攻略

Docker容器监控全攻略

1. 容器详细信息获取

在Docker的使用过程中,有时我们需要获取容器的详细信息,比如容器的创建时间、传递给容器的命令、端口映射情况以及容器的IP地址等。这时可以使用 docker inspect 命令。

以下是具体操作步骤:
1. 启动一个nginx容器:

$ docker run -d -p 80:80 nginx
  1. 使用 docker inspect 命令查看容器信息:
$ docker inspect kickass_babbage

输出结果示例:

[{
    "AppArmorProfile": "",
    "Args": [
        "-g",
        "daemon off;"
    ],
    "ExposedPorts": {
        "443/tcp": {},
        "80/tcp": {}
    },
    "NetworkSettings": {
        "IPAddress": "172.17.0.3"
    }
}]

docker inspect 命令还可以用于查看镜像信息:

$ docker inspect nginx

输出结果示例:

[{
    "Architecture": "amd64",
    "Author": "NGINX Docker Maintainers \"docker-maint@nginx.com\"",
    "Comment": "",
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "nginx",
            "-g",
            "daemon off;"
        ]
    }
}]

此外, docker inspect 命令有一个 --format 选项,可用于指定Go模板,从而提取容器或镜像的特定信息,而不是获取完整的JSON输出。例如,获取运行中容器的IP地址并检查其状态:

$ docker inspect -f '' kickass_babbage
172.17.0.3
$ docker inspect -f '' kickass_babbage
true

如果更喜欢使用其他Docker客户端,如 Docker-py ,也可以使用标准的Python字典表示法来访问容器和镜像的详细信息:

$ python
>>> from docker import Client
>>> c = Client(base_url="unix://var/run/docker.sock")
>>> c.inspect_container('kickass_babbage')['State']['Running']
True
>>> c.inspect_container('kickass_babbage')['NetworkSettings']['IPAddress']
u'172.17.0.3'
2. 运行中容器的使用统计获取

当我们有一个运行在Docker主机上的容器,并且想要监控其资源使用情况(如内存、CPU、网络)时,可以使用 docker stats 命令。该命令是在2015年2月10日引入的新API端点,在Docker 1.5及以上版本中可用。

操作步骤如下:
1. 启动一个Flask应用程序容器:

$ docker run -d -p 5000:5000 runseb/flask
  1. 使用 docker stats 命令查看容器的使用统计信息:
$ docker stats dreamy_mccarthy

输出示例:

CONTAINER           CPU %               MEM USAGE/LIMIT       MEM %               NET I/O
dreamy_mccarthy     0.03%               24.01 MiB/1.955 GiB   1.20%               648 B/648 B

由于 docker stats 命令返回的是一个数据流,需要使用 Ctrl - C 来终止数据流。

为了将这些统计信息用于进一步的可视化和分析,我们可以使用 curl 通过TCP请求访问Docker守护进程的stats API。具体步骤如下:
1. 配置本地Docker守护进程监听TCP端口2375。在Ubuntu系统上,编辑 /etc/default/docker 文件,添加以下内容:

DOCKER_OPTS="-H tcp://127.0.0.1:2375"
  1. 重启Docker守护进程:
$ sudo service docker restart
  1. 使用 curl 访问Docker远程API:
$ docker -H tcp://127.0.0.1:2375 run -d -p 5001:5000 runseb/flask
$ curl http://127.0.0.1:2375/containers/agitated_albattani/stats

如果喜欢使用Python,也可以使用 docker-py 来获取这些统计信息。示例Python脚本如下:

#!/usr/bin/env python
import json
import docker
import sys
cli = docker.Client(base_url='tcp://127.0.0.1:2375')
stats = cli.stats(sys.argv[1])
print json.dumps(json.loads(next(stats).rstrip('\n')), indent=4)
3. 监听Docker主机上的事件

如果想要监控Docker主机上的事件,如镜像的取消标签和删除以及容器的生命周期事件(如创建、销毁、杀死),可以使用 docker events 命令。

操作步骤如下:

$ docker events --help

输出:

Usage: docker events [OPTIONS]
Get real time events from the server
  -f, --filter=[]    Provide filter values (i.e., 'event=stop')
  --help=false       Print usage
  --since=""         Show all events created since timestamp
  --until=""         Stream events until this timestamp

可以使用 --since --until 选项来选择特定时间范围内的事件。例如:

$ docker events --since 1427890602

输出示例:

2015-04-01T12:17:04....9393146cb55e5bc9f04e20eb5a0622b3e26aae7: untag
2015-04-01T12:17:09....d5266f8777bfba4974ac56e3270e7760f6f0a81: untag
2015-04-01T12:17:22....d5266f8777bfba4974ac56e3270e7760f6f0a85: untag
2015-04-01T12:17:23....66f8777bfba4974ac56e3270e7760f6f0a81253: delete
2015-04-01T12:17:23....e9b5a793523481a0a18645fc77ad53c4eadsfa2: delete
2015-04-01T12:17:23....878585defcc1bc6f79d2728a13957871b345345: delete

也可以使用 docker-py 来获取事件列表。示例Python脚本如下:

#!/usr/bin/env python
import json
import docker
import sys
cli = docker.Client(base_url='unix://var/run/docker.sock')
events = cli.events(since=sys.argv[1], until=sys.argv[2])
for e in events:
    print e
4. 获取容器的日志

当有一个运行中的容器,并且想要从主机访问容器内进程的日志时,可以使用 docker logs 命令。

操作步骤如下:
1. 启动一个nginx容器:

$ docker run -d -p 80:80 nginx
  1. 查看容器列表:
$ docker ps

输出示例:

CONTAINER ID    IMAGE           ...  PORTS                         NAMES
dd0e926c4015    nginx:latest    ...  443/tcp, 0.0.0.0:80->80/tcp   gloomy_mclean
  1. 使用 docker logs 命令查看容器日志:
$ docker logs gloomy_mclean

输出示例:

192.168.34.1 - - [10/Mar/2015:10:12:35 +0000] "GET / HTTP/1.1" 200 612 "-" ...

如果想要获取连续的日志流,可以使用 -f 选项:

$ docker logs -f gloomy_mclean

此外,还可以使用 docker top 命令监控容器内运行的进程:

$ docker top gloomy_mclean

输出示例:

UID         PID         PPID     ...    CMD
root        5605        4732     ...    nginx: master process nginx -g daemon off;
syslog      5632        5605     ...    nginx: worker process
5. 使用Logspout收集容器日志

虽然可以使用 docker logs 命令获取单个容器的日志,但如果想要收集运行在多个Docker主机上的容器的日志并进行聚合,可以使用Logspout。

操作步骤如下:
1. 在一个Docker主机上安装Logspout以收集nginx容器的日志。首先拉取所需的镜像:

$ docker pull nginx
$ docker pull gliderlabs/logspout
  1. 启动nginx容器:
$ docker run -d --name webserver -p 80:80 nginx
  1. 启动Logspout容器,挂载Docker Unix套接字,并指定syslog端点:
$ docker run -d --name logspout -v /var/run/docker.sock:/tmp/docker.sock \
             gliderlabs/logspout syslog://192.168.34.11:5000
  1. 192.168.34.11 主机上使用Logstash容器收集日志。首先拉取Logstash镜像:
$ docker pull ehazlett/logstash
  1. 创建Logstash配置文件 logstash.conf
input {
  tcp {
    port => 5000
    type => syslog
  }
}
filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} \
      %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: \
      %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}
output {
  stdout { codec => rubydebug }
}
  1. 创建Dockerfile:
FROM ehazlett/logstash
COPY logstash.conf /etc/logstash.conf
ENTRYPOINT ["/opt/logstash/bin/logstash"]
  1. 构建Logstash镜像:
$ docker build -t logstash .
  1. 启动Logstash容器:
$ docker run -d --name logstash -p 5000:5000/udp log -f /etc/logstash.conf

当打开浏览器访问第一个Docker主机上的Nginx服务器时,日志将出现在Logstash容器中:

$ docker logs logstash

为了简化测试,可以克隆相关仓库并使用Vagrant启动两个Docker主机:

$ git clone https://github.com/how2dock/docbook.git
$ vagrant up
$ vagrant status

在Web服务器节点上运行nginx和Logspout容器:

$ vagrant ssh w
$ docker run --name nginx -d -p 80:80 nginx
$ docker run -d --name logspout -v /var/run/docker.sock:/tmp/docker.sock \
             gliderlabs/logspout syslog://192.168.34.11:5000

在elk节点上运行Logstash容器:

$ vagrant ssh elk
$ cd /vagrant
$ docker build -t logstash .
$ docker run -d --name logstash -p 5000:5000/udp log -f /etc/logstash.conf
6. 管理Logspout路由以存储容器日志

如果使用Logspout将日志流式传输到远程服务器,但想要修改端点,可以通过Logspout暴露的端口8000上的HTTP API来管理路由。

操作步骤如下:
1. 拉取包含curl的镜像并启动一个交互式容器:

$ docker pull tutum/curl
$ docker run -ti --link logspout:logspout tutum/curl /bin/bash
  1. 验证是否可以ping通Logspout容器:
root@c94a4eacb7cc:/# ping logspout
  1. 使用curl访问Logspout API:
root@c94a4eacb7cc:/# curl http://logspout:8000/logs

输出示例:

logspout|[martini] Started GET /logs for 172.17.0.12:38353
nginx|192.168.34.1 - - [10/Mar/2015:13:57:38 +0000] "GET / HTTP/1.1" 200  ...
nginx|192.168.34.1 - - [10/Mar/2015:13:57:43 +0000] "GET / HTTP/1.1" 200  ...
  1. 管理日志流的API暴露了 /routes 路由,可以使用标准的HTTP动词 GET DELETE POST 来列出、删除和更新流端点。例如:
root@1fbb2f9636a8:/# curl http://logspout:8000/routes

输出示例:

[
  {
    "id": "e508de0c9689",
    "target": {
      "type": "syslog",
      "addr": "192.168.34.11:5000"
    }
  }
]
root@1fbb2f9636a8:/# curl http://logspout:8000/routes/e508de0c9689

输出示例:

{
  "id": "e508de0c9689",
  "target": {
    "type": "syslog",
    "addr": "192.168.34.11:5000"
  }
}
root@1fbb2f9636a8:/# curl -X DELETE http://logspout:8000/routes/e508de0c9689
root@1fbb2f9636a8:/# curl http://logspout:8000/routes

输出示例:

[]
root@1fbb2f9636a8:/# curl -X POST \
                          -d '{"target": {"type": "syslog", \
                                          "addr": "192.168.34.11:5000"}}' \
                          http://logspout:8000/routes

输出示例:

{
  "id": "f60d30502654",
  "target": {
    "type": "syslog",
    "addr": "192.168.34.11:5000"
  }
}
root@1fbb2f9636a8:/# curl http://logspout:8000/routes

输出示例:

[
  {
    "id": "f60d30502654",
    "target": {
      "type": "syslog",
      "addr": "192.168.34.11:5000"
    }
  }
]

还可以创建一个路由到Papertrail,它可以自动备份到Amazon S3。

7. 使用Elasticsearch和Kibana存储和可视化容器日志

之前我们只使用Logstash接收日志并将其发送到stdout,现在可以进一步使用Elasticsearch来存储容器日志,并使用Kibana进行可视化和查询。

操作步骤如下:
1. 启动Elasticsearch和Kibana容器:

$ docker run --name es -d -p 9200:9200 -p 9300:9300 ehazlett/elasticsearch
$ docker run --name kibana -d -p 80:80 ehazlett/kibana
  1. 启动Logstash容器,并将其链接到Elasticsearch容器:
$ docker run -d --name logstash -p 5000:5000/udp \
             --link es:elasticsearch ehazlett/logstash \
             -f /etc/logstash.conf.sample
  1. 打开浏览器,访问运行Kibana容器的Docker主机的端口80,将看到Kibana默认仪表盘。选择“1. Sample Dashboard”,将从索引中提取一些信息并构建一个基本仪表盘,应该可以看到访问Nginx服务器获得的日志。

需要注意的是,在上述解决方案中,Elasticsearch运行在单个容器中,如果杀死并删除该容器,Logspout流式传输的日志所创建的索引将不会持久化。建议挂载一个卷并进行备份,以持久化Elasticsearch数据。此外,如果需要更多的存储空间和高效的索引,应该在多个Docker主机上创建Elasticsearch集群。

8. 使用Collectd可视化容器指标

除了可视化应用程序日志,还可以使用Collectd来监控容器的指标,如CPU。

操作步骤如下:
使用两个Docker主机进行测试,一个主机(worker)运行四个容器:nginx容器用于生成虚拟日志到stdout,logspout容器将所有stdout日志路由到Logstash实例,一个生成合成负载的容器(如 borja/unixbench )和一个collectd容器。另一个主机(monitor)运行四个容器:Logstash容器收集来自logspout的日志,Elasticsearch容器存储日志,Kibana容器可视化这些日志,以及Graphite容器。

在worker主机上,使用Docker Compose启动所有容器,YAML文件如下:

nginx:
  image: nginx
  ports:
   - 80:80
logspout:
  image: gliderlabs/logspout
  volumes:
   - /var/run/docker.sock:/tmp/docker.sock
  command: syslog://192.168.33.11:5000
collectd:
  build: .
  volumes:
   - /var/run/docker.sock:/var/run/docker.sock
load:
  image: borja/unixbench

collectd容器基于以下Dockerfile构建:

FROM debian:jessie
RUN apt-get update && apt-get -y install \
    collectd \
    python \
    python-pip
RUN apt-get clean
RUN pip install docker-py
RUN groupadd -r docker && useradd -r -g docker docker
ADD docker-stats.py /opt/collectd/bin/docker-stats.py
ADD docker-report.py /opt/collectd/bin/docker-report.py
ADD collectd.conf /etc/collectd/collectd.conf
RUN chown -R docker /opt/collectd/bin
CMD ["/usr/sbin/collectd","-f"]

在monitor主机上,使用Docker Compose启动所有容器,YAML文件如下:

es:
  image: ehazlett/elasticsearch
  ports:
   - 9300:9300
   - 9200:9200
kibana:
  image: ehazlett/kibana
  ports:
   - 8080:80
graphite:
  image: hopsoft/graphite-statsd
  ports:
   - 80:80
   - 2003:2003
   - 8125:8125/udp
logstash:
  image: ehazlett/logstash
  ports:
   - 5000:5000
   - 5000:5000/udp
  volumes:
   - /root/docbook/ch09/collectd/logstash.conf:/etc/logstash.conf
  links:
   - es:elasticsearch
  command: -f /etc/logstash.conf

当所有容器在两个主机上启动,并且网络和防火墙配置正确后,就可以访问worker主机端口80上的nginx容器、monitor主机端口8080上的Kibana仪表盘以及monitor主机端口80上的Graphite仪表盘。Graphite仪表盘将显示来自worker主机上所有容器的基本CPU指标。

以下是一个简单的mermaid流程图,展示了使用Collectd监控容器指标的流程:

graph LR
    A[Worker主机] --> B(nginx容器)
    A --> C(logspout容器)
    A --> D(collectd容器)
    A --> E(负载容器)
    B --> C
    C --> F[Monitor主机]
    F --> G(Logstash容器)
    F --> H(Elasticsearch容器)
    F --> I(Kibana容器)
    F --> J(Graphite容器)
    D --> J
    G --> H
    H --> I

综上所述,通过以上各种方法,可以全面地对Docker容器进行监控,包括获取容器详细信息、监控资源使用情况、监听事件、收集和管理日志以及可视化容器指标等。这些方法可以帮助我们更好地管理和维护Docker容器化的应用程序。

Docker容器监控全攻略

9. 各监控方法总结与对比

为了更清晰地了解不同监控方法的特点和适用场景,下面对前面介绍的各种监控方法进行总结和对比。

监控方法 功能 操作步骤 适用场景
docker inspect 获取容器或镜像的详细信息,如创建时间、命令、端口映射、IP地址等 1. 启动容器;2. 使用 docker inspect 命令查看信息;3. 可使用 --format 选项提取特定信息;4. 也可用 Docker - py 获取信息 需要详细了解容器或镜像配置时
docker stats 监控运行中容器的资源使用情况,如内存、CPU、网络 1. 启动容器;2. 使用 docker stats 命令查看统计信息;3. 可通过 curl docker - py 访问API获取信息 实时监控容器资源使用,进行性能调试时
docker events 监控Docker主机上的事件,如镜像操作和容器生命周期事件 1. 使用 docker events 命令获取事件流;2. 可使用 --since --until 选项选择特定时间范围;3. 可用 docker - py 获取事件列表 关注Docker系统的各种事件,进行系统审计时
docker logs 获取容器内进程的日志 1. 启动容器;2. 使用 docker logs 命令查看日志;3. 可使用 - f 选项获取连续日志流;4. 可用 docker top 监控容器内进程 排查容器内应用程序问题,查看日志时
Logspout 收集多个Docker主机上的容器日志并聚合 1. 拉取相关镜像;2. 启动nginx和Logspout容器;3. 配置Logstash并启动容器;4. 可使用Vagrant简化测试 管理分布式环境下的容器日志时
Logspout路由管理 修改Logspout的日志流端点 1. 拉取包含curl的镜像并启动交互式容器;2. 验证与Logspout容器的连接;3. 使用curl访问Logspout API;4. 使用HTTP动词管理路由 需要调整日志存储位置或添加新的存储端点时
Elasticsearch和Kibana 存储和可视化容器日志 1. 启动Elasticsearch和Kibana容器;2. 启动Logstash容器并链接到Elasticsearch;3. 访问Kibana仪表盘查看日志 对容器日志进行深入分析和可视化展示时
Collectd 可视化容器指标,如CPU 1. 使用两个Docker主机;2. 在worker主机上使用Docker Compose启动相关容器;3. 在monitor主机上使用Docker Compose启动相关容器;4. 访问相关仪表盘查看指标 监控容器的性能指标,进行容量规划时
10. 监控方案的选择与组合

在实际应用中,需要根据具体的需求和场景选择合适的监控方案,有时可能需要组合使用多种方法。

  • 基础监控 :对于简单的开发和测试环境, docker inspect docker stats 可以满足基本的监控需求。通过 docker inspect 可以了解容器的配置信息, docker stats 可以实时监控容器的资源使用情况。
  • 事件监控 :在生产环境中,需要关注Docker系统的各种事件,如容器的创建、销毁和镜像的操作。此时可以使用 docker events 来监听这些事件,及时发现异常情况。
  • 日志管理 :对于分布式环境下的多个容器,使用Logspout收集和聚合日志,再结合Elasticsearch和Kibana进行存储和可视化是一个不错的选择。这样可以方便地对日志进行分析和查询,快速定位问题。
  • 性能监控 :如果需要监控容器的性能指标,如CPU、内存等,可以使用Collectd。它可以将指标发送到Graphite仪表盘,直观地展示容器的性能状况。

以下是一个mermaid流程图,展示了根据不同需求选择监控方案的过程:

graph LR
    A[监控需求] --> B{简单监控}
    B -- 是 --> C[docker inspect和docker stats]
    B -- 否 --> D{事件监控}
    D -- 是 --> E[docker events]
    D -- 否 --> F{日志管理}
    F -- 是 --> G[Logspout + Elasticsearch + Kibana]
    F -- 否 --> H{性能监控}
    H -- 是 --> I[Collectd + Graphite]
    H -- 否 --> J[根据具体情况选择]
11. 监控的注意事项与最佳实践

在进行Docker容器监控时,还需要注意以下事项和遵循一些最佳实践。

  • 资源占用 :监控工具本身也会占用一定的系统资源,尤其是在大规模的容器环境中。因此,需要合理选择监控工具和配置监控频率,避免对系统性能产生过大影响。
  • 数据持久化 :对于重要的监控数据,如日志和指标,需要进行持久化存储。例如,使用Elasticsearch存储日志时,要考虑挂载卷和备份数据,以防止数据丢失。
  • 安全性 :在配置监控工具时,要注意安全性。例如,在使用 curl 访问Docker远程API时,要确保网络安全,避免数据泄露。
  • 自动化 :可以使用脚本或自动化工具来定期执行监控任务,如定期收集日志、生成报表等。这样可以提高监控效率,减少人工操作。
12. 未来监控技术的发展趋势

随着Docker和容器技术的不断发展,容器监控技术也在不断演进。未来可能会出现以下发展趋势。

  • 智能化监控 :利用人工智能和机器学习技术,对监控数据进行分析和预测。例如,通过分析历史数据,预测容器的性能瓶颈和故障,提前进行处理。
  • 集成化监控平台 :出现更多集成化的监控平台,将各种监控工具和功能整合在一起,提供一站式的监控解决方案。这样可以方便用户进行统一管理和操作。
  • 云原生监控 :随着云原生技术的普及,监控工具将更好地与云原生环境集成。例如,与Kubernetes等容器编排系统深度集成,实现对集群级别的监控。

总之,Docker容器监控是容器化应用程序管理和维护的重要环节。通过选择合适的监控方法和遵循最佳实践,可以确保容器的稳定运行和高效性能。同时,关注未来监控技术的发展趋势,有助于我们更好地应对不断变化的技术环境。

AI智能图表创作平台,轻松对话绘图 Next AI Draw.io 是一款融合大语言模型与 draw.io 的创新型图表绘制平台。无需掌握复杂的绘图规则,只需通过自然语言输入,即可完成图表构建、修改与增强,帮助开发者和可视化创作者大幅提升效率。无论你是想绘制 AWS 架构图、GCP 拓扑,还是一个带有动画连接器的系统结构图,这款工具都能通过智能对话快速呈现。 核心亮点 LLM驱动的图表构建 通过 Chat 接口与 AI 对话,快速生成符合语义的图表,轻松支持 draw.io XML 格式解析。 图像识别与复制增强 上传一张已有图表或架构草图,AI 自动识别结构并重建图表,可进一步优化样式或内容。 图表版本管理 内置图表历史记录系统,支持版本切换与回滚,便于团队协作与修改回溯。 交互式绘图对话体验 内置对话界面,可边聊边画图,所见即所得,轻松优化图表结构与排版。 多云架构模板一键生成 支持 AWS、GCP、Azure 架构图自动生成,适配图标库,适合开发、运维、架构师使用。 GCP架构图 动画连接器 支持为图表元素添加动态连接器,提升图表交互性与演示感。 技术架构与支持 Next.js:提供稳定高性能的前端体验 Vercel AI SDK:整合流式对话与多模型支持 react-drawio:实现图表编辑与可视化渲染 多模型接入:支持 OpenAI、Anthropic、Google、Azure、DeepSeek、Ollama 等主流 AI API claude-sonnet-4-5 专项训练:在 AWS 架构图任务上表现优异
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值