一、Docker日志

当前Docker对运行在它内部应用的日志管理较薄弱,每个运行在容器内应用的日志输出统一保存在宿主机的/var/log目录下,文件夹以容器ID命名。当前Docker仅将应用的stdoutstderr两个日志输出通过通道重定向到/var/log下。Docker以JSON消息记录每一行日志,这将导致文件增长过快,从而超过主机磁盘限额。此外,日志没有自动切分功能,docker logs命令返回的日志记录也过于冗长。
目前处理Docker日志的主流方案,按照日志处理工具安装的位置主要分为3种。

  • 在容器内收集。除了正在运行的应用程序外,每个容器设置一个日志收集进程。这种方案需要定制Docker镜像,典型代表为baseimage-dockerR项目,它使用runitR连同syslog提供了这方面的日志收集方案示例。
  • 在容器外收集。在宿主机上运行一个单独收集日志的代理,收集所有容器的日志。容器有一个从该宿主机挂载的volume卷,它们把日志记录在挂载卷中,由代理进程接收。当然,也可以使用代理直接处理存储在/var/log目录下的容器日志,该方案的典型代表为Fluentd项目。
  • 在专用容器中收集。这是直接在宿主机上运行代理收集日志的变种方案。该收集代理同样运行在一个容器中,并且该容器的卷使用docker runvolumes-from选项被绑定给所有应用程序容器。这种方案的实现细节可以参考Docker and Logstash一文。

二、Docker监控

Docker容器监控维度

1.主机维度

对于Docker的容器监控,主要以容器级别的监控指标为主。我们可以监控主机的以下相关信息:

  • 主机的CPU情况和使用量
  • 主机的内存情况和使用量
  • 主机上的本地镜像情况
  • 主机上的容器运行情况

2.镜像维度

作为容器的基础,还需要对主机上的镜像信息进行监控。镜像的相关信息一般为静态信息,可以反映出主机上用于构建容器的镜像的基础情况,以便从底层来掌握和优化主机上的容器。我们可以监控镜像的以下相关信息:

  • 镜像的基本信息:包括镜像的总数量、ID、名称、版本、大小等。

  • 镜像与容器的对应关系

  • 镜像构建的历史信息(层级的依赖信息)

3.容器维度

使用者需要对容器的各类信息进行实时监控,以保证应用的正常运行。Docker在底层使用了Linux内核提供的资源机制—–namespacecgroups,以此来支持容器的运行。通过这些机制,可以很方便地获取容器的各项监控指标。

  • 容器的基本信息
  • 容器的运行状态
  • 容器的用量信息

容器的基本信息包括容器的总数量、ID、名称、镜像、启动命令、端口等信息。容器监控时可以依据容器的运行状态,即运行中、暂停、停止及异常退出,来统计各状态的容器的数量,并实时反馈各个容器的运行状态。容器的用量信息则是用户最关心的,也是监控中最为复杂的部分,它可以统计容器的CPU使用率、内存使用量、块设备IO使用量、网络使用情况等资源的使用情况。这一部分监控数据大多数都来源于Cgroup下面的限制文件,

容器监控命令

docker ps

可以查看当前主机上的容器信息,包括容器ID、镜像名、容器启动执行命令、创建时间、状态、端口信息和容器名。该命令默认只列出当前正在运行的容器的信息,用户可以通过使用-a参数来列出包括已停止的所有容器的信息。

1
2
3
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e96786091371 redis:latest "docker-entrypoint.s…" 41 hours ago Up 41 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis

docker ps一般用于查找容器ID

docker images

用户通过使用docker images命令,可以查看当前主机上的镜像信息,包括镜像所属的库、标签、ID、创建时间和实际大小。该命令默认只会列出所有顶层镜像的信息,但用户可以通过-a参数来查看所有中间层的镜像的信息。

1
2
3
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 7faaec683238 4 days ago 113MB

docker stats

统计容器状态的信息,同时它还有配套的API ( GET /containers/(id)/stats ),可供开发人员调用。使用该命令,用户可以实时监控启动中的容器的运行情况,包括CPU、内存、块设备I/O和网络I/O,这些信息都会定期刷新以显示最新的运行情况。

1
2
3
4
5
6
7
8
9
10
docker stats myredis 

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
e96786091371 myredis 0.11% 9.711MiB / 1.795GiB 0.53% 689kB / 3.47MB 2.97MB / 1.21MB 6

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
e96786091371 myredis 0.11% 9.711MiB / 1.795GiB 0.53% 689kB / 3.47MB 2.97MB / 1.21MB 6

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
e96786091371 myredis 0.10% 9.711MiB / 1.795GiB 0.53% 689kB / 3.47MB 2.97MB / 1.21MB 6

通过stats API可以查看更多详细信息

docker inspect

查看镜像或容器的底层详细信息,了解镜像或容器的完整构建信息,包括基础配置、主机配置、网络设置、状态信息等。同时,如果需要查看其特定信息,可以通过-f参数来设定输出格式。

docker top

查看容器中进程的运行情况。可以使用户在没有通过/bin/bash交互时,查看容器的进程信息

1
2
3
4
docker top myredis 
UID PID PPID C STIME TTY TIME CMD
polkitd 5849 5831 0 Oct15 ? 00:02:29 redis-server *:6379
root 10089 5831 0 Oct15 pts/0 00:00:00 /bin/bash

docker port

查看容器与主机之间的端口映射关系

1
2
3
docker port myredis 
6379/tcp -> 0.0.0.0:6379
6379/tcp -> :::6379