Docker 容器日志分析

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker 容器日志分析

查看容器日志



先使用  docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine 命令启动一个nginx容器。如果没有异常,会得到容器ID如  d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00  的长串。再使用  curl -i http://127.0.0.1  访问服务,确认nginx容器正常启动运行。最后使用  docker logs -f d24  查看容器的日志输出,大概如下:


172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"


一般来说使用容器ID的前3位即可


以上就是我们查看容器日志的日常方法了,非常简单实用。


容器日志文件存储



容器的日志会以json文件方式存储在本地磁盘,可以使用下面方式查看文件路径  docker inspect d42 | grep Log 可以找到:


"LogPath": "/var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log",


注意1:mac上没有/var/lib/docker目录 ,因为docker for mac的运作方式不一样,最好使用linux系统练习。

注意2:  如果LogPath内容为空,大概是因为docker engine版本,升级docker版本能到docker-ce 18.09.3


查看 d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log 文件,可以看到:


{"log":"172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.29.0\" \"-\"\r\n","stream":"stdout","time":"2019-03-24T03:51:21.982476951Z"}


这条信息的log字段内容和之前通过  docker logs  命令查看的内容一致。


容器日志会跟随容器生命周期,容器销毁后日志也会销毁。使用  docker stop 24  关停测试的nginx服务。因为容器启动使用时候用了  --rm  参数,关停后会自动清理删除,所以会发现 /var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00  目录不存在了,相应的日志文件也就删除了。


容器日志文件滚动策略



docker容器日志默认写入json文件,在线上运行时候会有磁盘写满的风险。可以调整策略,让其进行滚动。修改/etc/docker/daemon.json(如果没有就手工创建一个),增加下面内容:


{
  "log-opts": {
    "max-size": "1m",
    "max-file": "3"
  }
}


修改完成后重启docker服务:


systemctl daemon-reload
systemctl restart docker.service


测试一下新的日志策略,使用下面的命令创建一个容器:


docker run -d --rm alpine:3.6 sh -c "while true; do echo hello world; usleep 10; done"


这个alpine容器就是每隔10微秒输出hello world,保持高频度输出,快速生产日志文件。


注:shell中的时间控制
1、sleep : 默认为秒。
sleep 1s 表示延迟一秒  
sleep 1m 表示延迟一分钟  
sleep 1h 表示延迟一小时  
sleep 1d 表示延迟一天    
2、usleep : 默认以微秒。  
1s = 1000ms = 1000000us


按照前文中查看日志文件的方法


# pwd
/var/lib/docker/containers/aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3
# ls -lah
total 2.6M
drwx------ 4 root root 4.0K Mar 24 16:22 .
drwx------ 3 root root 4.0K Mar 24 16:21 ..
-rw-r----- 1 root root 647K Mar 24 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log
-rw-r----- 1 root root 977K Mar 24 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.1
-rw-r----- 1 root root 977K Mar 24 16:21 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.2


很容易发现,日志文件的策略就是维持3个1m大小文件存在,和我们设置保持一致。


测试完成后,记得使用docker stop aa3 清理测试现场,max-size也可以按照真实需求调整大小。


nginx容器日志



了解docker容器的日志策略后,再看看常用的容器是如何处理的。先看看nginx容器。


首先  docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine  创建一个nginx容器,然后  docker exec -it b6d sh  进入容器,查看/etc/nginx/nginx.conf可以看到下面内容:


error_log  /var/log/nginx/error.log warn;
access_log  /var/log/nginx/access.log  main;


也就是nginx会将错误日志和访问日志写入对应的日志文件。继续查看/var/log/nginx目录:


/var/log/nginx # ls -lah
total 0
drwxr-xr-x    2 root     root          39 Mar  4 07:54 .
drwxr-xr-x    3 root     root          18 Mar  4 07:54 ..
lrwxrwxrwx    1 root     root          11 Jan 31 23:32 access.log -> /dev/stdout
lrwxrwxrwx    1 root     root          11 Jan 31 23:32 error.log -> /dev/stderr


这就发现奥秘了,access.log文件会通过软链接重定向到标准输出,而错误日志error.log则会重定向标准错误。这样使用docker log命令就可以看到nginx的访问日志了。


为了进一步验证,查看nginx dockerfile文件,其中有:


# forward request and error logs to docker log collector
  && ln -sf /dev/stdout /var/log/nginx/access.log \
  && ln -sf /dev/stderr /var/log/nginx/error.log


可见nginx镜像创建时候就定义好了日志文件的输出。


同样使用docker stop 524清理现场,以后就不再介绍清理这一步骤了。


mysql容器日志



启动一个mysql容器


docker run --rm -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


不难看到mysql容器日志输出, 截取其中片段如下:


Initializing database
2019-03-24T08:48:19.102726Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-03-24T08:48:20.241459Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-03-24T08:48:20.414933Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-03-24T08:48:20.509897Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 935a6ee7-4e11-11e9-b135-0242ac110002.
2019-03-24T08:48:20.519148Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-03-24T08:48:20.519843Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2019-03-24T08:48:24.066683Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066730Z 1 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066740Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066756Z 1 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066761Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066772Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066814Z 1 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066822Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
Database initialized
Initializing certificates
Generating a RSA private key


查看mysql Dockerfile  文件,可以知道mysql镜像启动入口在entrypoint.sh,从脚本中发现:


echo 'Initializing database'
"$@" --initialize-insecure
echo 'Database initialized'


这样就是mysql容器启动时候的输出对应起来了。entrypoint.sh比较复杂,主要功能就是启动mysqld,并将日志输出,因为不是本文重点,就不详细介绍了。


总结



  1. docker容器默认输出到本地json文件,并且可以对其进行大小和数量控制。


  1. 应用容器日志可以先生成日志文件,然后将应用日志文件软连接到标准输出,比如nginx;也可以在启动时候直接将日志打印到标准输出,比如mysql。


参考链接


Docker 日志都在哪里?怎么收集?


JSON File logging driver


docker mysql

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
27天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
189 77
|
2天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
8天前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
75 35
|
7天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
13天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
78 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
19天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
44 3
实战~如何组织一个多容器项目docker-compose
|
10天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
27 7
|
13天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
40 4
|
12天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
29天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
91 3