有多种方法可以监视Docker容器。 该博客将介绍一些简单易用的选项:
-
docker stats
命令 - Docker远程API
- 顾问
- 普罗米修斯
- InfluxDB
- Docker通用控制平面
让我们看看它们中的每一个。
我们将使用Couchbase服务器来收集监视数据。
让我们以以下方式启动服务器:
docker run -d -p 8091-8093:8091-8093 -p 11210:11210 --name couchbase arungupta/couchbase
在github.com/arun-gupta/docker-images/tree/master/couchbase中解释了arungupta arungupta/couchbase
图像。 它执行:
- 设置索引和数据服务的内存
- 为Couchbase服务器配置索引,数据和查询服务
- 设置用户名和密码凭证
现在让我们收集监视数据。
码头工人统计
docker stats
显示以下容器资源使用情况统计docker stats
的实时流:
- CPU使用率
- 内存使用率,限制,使用率百分比
- 网络I / O
- 磁盘I / O
统计信息每秒更新一次。
这是一个示例输出:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
4827f0139b1f 10.94% 706.2 MB / 1.045 GB 67.61% 299.7 kB / 2.473 MB 456 MB / 327.3 MB
默认情况下,此命令显示所有正在运行的容器的统计信息。 可以指定容器名称或ID的列表,以空格分隔,以将流限制为正在运行的容器的子集。
例如,仅可将Couchbase容器的统计信息视为:
docker stats couchbase
其中couchbase
是容器名称。
输出看起来像:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
couchbase 12.50% 708.2 MB / 1.045 GB 67.80% 301 kB / 2.477 MB 456 MB / 327.6 MB
可以指定--no-stream
选项,其中仅显示第一个快照,并且不传输结果。
Docker Logentries容器可用于收集此数据。
Docker远程API
Docker守护程序提供了远程REST API。 客户端使用此API与引擎进行通信。 该API也可以由其他工具(例如curl或Chrome Postman REST Client)调用。 如果要在OSX Mavericks上使用Docker Machine创建Docker守护程序,那么使此API正常工作会有些棘手。
如果您使用的是Mac,请按照Enable Docker Remote API中的说明进行操作,以确保curl可以调用此REST API。
提供有关容器统计信息的API是/containers/{id}/stats
或/containers/{name}/stats.
然后可以获得有关该容器的更多统计信息:
~ > curl https://192.168.99.100:2376/containers/42d1414883af/stats --cert $DOCKER_CERT_PATH/cert2.p12 --pass mypass --key $DOCKER_CERT_PATH/key.pem --cacert $DOCKER_CERT_PATH/ca.pem
显示以下结果(格式化):
{
"read": "2016-02-07T13:26:56.142981314Z",
"precpu_stats": {
"cpu_usage": {
"total_usage": 0,
"percpu_usage": null,
"usage_in_kernelmode": 0,
"usage_in_usermode": 0
},
"system_cpu_usage": 0,
"throttling_data": {
"periods": 0,
"throttled_periods": 0,
"throttled_time": 0
}
},
"cpu_stats": {
"cpu_usage": {
"total_usage": 242581854769,
"percpu_usage": [242581854769],
"usage_in_kernelmode": 33910000000,
"usage_in_usermode": 123040000000
},
"system_cpu_usage": 3367860000000,
"throttling_data": {
"periods": 0,
"throttled_periods": 0,
"throttled_time": 0
}
},
"memory_stats": {
"usage": 693821440,
"max_usage": 818733056,
"stats": {
"active_anon": 282038272,
"active_file": 28938240,
"cache": 82534400,
"hierarchical_memory_limit": 9223372036854771712,
"hierarchical_memsw_limit": 9223372036854771712,
"inactive_anon": 329543680,
"inactive_file": 53284864,
"mapped_file": 26558464,
"pgfault": 809513,
"pgmajfault": 2559,
"pgpgin": 1015608,
"pgpgout": 940757,
"rss": 611270656,
"rss_huge": 136314880,
"swap": 249049088,
"total_active_anon": 282038272,
"total_active_file": 28938240,
"total_cache": 82534400,
"total_inactive_anon": 329543680,
"total_inactive_file": 53284864,
"total_mapped_file": 26558464,
"total_pgfault": 809513,
"total_pgmajfault": 2559,
"total_pgpgin": 1015608,
"total_pgpgout": 940757,
"total_rss": 611270656,
"total_rss_huge": 136314880,
"total_swap": 249049088,
"total_unevictable": 0,
"total_writeback": 0,
"unevictable": 0,
"writeback": 0
},
"failcnt": 0,
"limit": 1044574208
},
"blkio_stats": {
"io_service_bytes_recursive": [{
"major": 8,
"minor": 0,
"op": "Read",
"value": 301649920
}, {
"major": 8,
"minor": 0,
"op": "Write",
"value": 248315904
}, {
"major": 8,
"minor": 0,
"op": "Sync",
"value": 201003008
}, {
"major": 8,
"minor": 0,
"op": "Async",
"value": 348962816
}, {
"major": 8,
"minor": 0,
"op": "Total",
"value": 549965824
}],
"io_serviced_recursive": [{
"major": 8,
"minor": 0,
"op": "Read",
"value": 41771
}, {
"major": 8,
"minor": 0,
"op": "Write",
"value": 72796
}, {
"major": 8,
"minor": 0,
"op": "Sync",
"value": 61246
}, {
"major": 8,
"minor": 0,
"op": "Async",
"value": 53321
}, {
"major": 8,
"minor": 0,
"op": "Total",
"value": 114567
}],
"io_queue_recursive": [],
"io_service_time_recursive": [],
"io_wait_time_recursive": [],
"io_merged_recursive": [],
"io_time_recursive": [],
"sectors_recursive": []
},
"pids_stats": {},
"networks": {
"eth0": {
"rx_bytes": 40192,
"rx_packets": 285,
"rx_errors": 0,
"rx_dropped": 0,
"tx_bytes": 222138,
"tx_packets": 150,
"tx_errors": 0,
"tx_dropped": 0
}
}
}
有关内存,磁盘和网络的更多详细信息。 每秒推送一组新的指标。
顾问
cAdvisor或Container Advisor提供主机和容器指标。 它是一个正在运行的守护程序,用于收集,聚合,处理和导出有关正在运行的容器的信息。
让我们启动cAdvisor容器:
docker run -d --name=cadvisor -p 8080:8080 --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro google/cadvisor:latest
cAdvisor仪表板仅显示最近60秒的数据。 但是,支持多个后端,例如Prometheus和InfluxDB ,可以长期存储,检索和分析。
使用Couchbase查询工具连接Couchbase服务器:
~ > docker run -it --link couchbase:db arungupta/couchbase cbq --engine http://db:8093
Couchbase query shell connected to http://db:8093/ . Type Ctrl-D to exit.
cbq>
调用N1QL查询 :
cbq> select * from `travel-sample` limit 1;
{
"requestID": "7af2d1b1-c37e-4c75-a913-cfaa99dcabdd",
"signature": {
"*": "*"
},
"results": [
{
"travel-sample": {
"callsign": "MILE-AIR",
"country": "United States",
"iata": "Q5",
"icao": "MLA",
"id": 10,
"name": "40-Mile Air",
"type": "airline"
}
}
],
"status": "success",
"metrics": {
"elapsedTime": "10.292951ms",
"executionTime": "10.232921ms",
"resultCount": 1,
"resultSize": 300
}
}
cAdvisor仅存储一分钟的数据,这是仪表板的捕获内容:
和备忘录用法:
有很多工具可以使用cAdvisor生成的数据并将其显示在漂亮的仪表板上。
有关更多详细信息,请访问github.com/google/cadvisor/tree/master/docs 。
Docker通用控制平面
Docker Universal Control Plane(DUCP)允许从防火墙内部管理和部署Dockerized分布式应用程序。 它与LDAP / AD等关键系统集成以管理用户,并为IT运营团队提供部署和管理界面。 RBAC,与Docker Trusted Registry的SSO集成,简单易用的Web UI是一些关键功能。 阅读产品概述以获取完整的功能集。
使用Docker Machine进行Docker通用控制计划是在本地计算机上体验此操作的最简单方法。 这些说明非常详细,可以直接使用。 这是部署Couchbase映像后的一些映像。
DUCP安装由DUCP控制器和一个或多个主机组成。 这些是在Docker Swarm集群中配置的。 然后在这些集群上启动容器:
端口映射很容易定义:
容器运行后,可以看到监视状态:
最后是漂亮的仪表板:
提供了一个客户端软件包 ,该软件包将有关Docker Swarm集群的信息显示为:
Containers: 10
Running: 10
Paused: 0
Stopped: 0
Images: 15
Server Version: swarm/1.1.3
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
node1: 192.168.99.101:12376
└ Status: Healthy
└ Containers: 7
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.004 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.1.19-boot2docker, operatingsystem=Boot2Docker 1.10.3 (TCL 6.4.1); master : 625117e - Thu Mar 10 22:09:02 UTC 2016, provider=virtualbox, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-04-09T00:12:53Z
node2: 192.168.99.102:12376
└ Status: Healthy
└ Containers: 3
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 2.004 GiB
└ Labels: executiondriver=native-0.2, kernelversion=4.1.19-boot2docker, operatingsystem=Boot2Docker 1.10.3 (TCL 6.4.1); master : 625117e - Thu Mar 10 22:09:02 UTC 2016, provider=virtualbox, storagedriver=aufs
└ Error: (none)
└ UpdatedAt: 2016-04-09T00:12:48Z
Cluster Managers: 1
192.168.99.101: Healthy
└ Orca Controller: https://192.168.99.101:443
└ Swarm Manager: tcp://192.168.99.101:3376
└ KV: etcd://192.168.99.101:12379
Plugins:
Volume:
Network:
Kernel Version: 4.1.19-boot2docker
Operating System: linux
Architecture: amd64
CPUs: 2
Total Memory: 4.008 GiB
Name: ucp-controller-node1
ID: 6LTO:GVZJ:2M6Z:DONM:ZAKR:2JIL:ZWJG:KY7R:G3EL:AS2Y:X22F:RXM3
Labels:
com.docker.ucp.license_key=XXXXXXXXXXXXXXXXXXXXXXXX
com.docker.ucp.license_max_engines=1
com.docker.ucp.license_expires=XXXXXXXXXXXXXXXXXXXXXXXX
有很多工具可提供监视数据:
docker stats和Docker Remote API当然是最简单的监视数据快照。 从那里开始,它才变得有趣!