幸运蛋蛋pc开奖
这篇文章主要介绍了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容器正常启动运?#23567;?#26368;后使用  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 可以?#19994;?

"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字?#25991;?#23481;和之前通过  docker logs  命令查看的内容一致。

容器日志会跟随容器生命周期,容器销毁后日志?#19981;?#38144;毁。使用  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] [email protected] is created with an empty password ! Please consider switching off the --initialize-insecure option.
2019-03-24T08:48:24.066683Z 1 [Warning] 'user' entry '[email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066730Z 1 [Warning] 'user' entry '[email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066740Z 1 [Warning] 'user' entry '[email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066756Z 1 [Warning] 'db' entry 'performance_schema [email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066761Z 1 [Warning] 'db' entry 'sys [email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066772Z 1 [Warning] 'proxies_priv' entry '@ [email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066814Z 1 [Warning] 'tables_priv' entry 'user [email protected]' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066822Z 1 [Warning] 'tables_priv' entry 'sys_config [email protected]' ignored in --skip-name-resolve mode.
Database initialized
Initializing certificates
Generating a RSA private key

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

echo 'Initializing database'
"[email protected]" --initialize-insecure
echo 'Database initialized'

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

总结

    docker容器默认输出到本地json文件,并且可以对其进行大小和数量控制。 应用容器日志可以先生成日志文件,然后将应用日志文件软连接到标准输出,比如nginx;也可以在启动时候直接将日志打印到标准输出,比如mysql。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持爱安网。

最新资讯
不只是5G!在这个领域华为正紧密布局

不只是5G!在这个领域华

华为9月18日发布全球最快的人工智能(AI)训练集群Atlas 9
三星欲借5G手机“翻盘”中国市场

三星欲借5G手机“翻盘

三星电子9月12日在中国市场推出旗下新旗舰Galaxy Note
利用朋友圈曝光老赖值得推广

利用朋友圈曝光老赖值

这样做是为让被执行人迫于熟人传播的压力而履行义务,也
转型阵痛中的世联行押注“互联网+”有戏吗?

转型阵痛中的世联行押

世联行在互联网+业务上开?#35745;?#39057;“发力?#20445;?#35851;求新的突破
“剪刀手”一出无隐私? 网络安全召唤AI反制技术

“剪刀手”一出无隐私

如需真正地在信息内容真伪识别中广泛且有效地应用AI技
中国电信明年上半年推出 2000元以内5G手机

中国电信明年上半年推

陆良军称,2020年中国5G手机将达到1.7亿部,中国电信将占6
最新文章
虚拟机ubuntu16.04无法连网的解决方法

虚拟机ubuntu16.04无

这篇文章主要为大家详细介绍了虚拟机ubuntu16.04无法
在Bash脚本中创建和使用数组方法总结

在Bash脚本中创建和使

在本篇文章里小编给大家整理了关于在Bash脚本中创建和
Linux上通过SSH?#20197;?#36828;程文件系统方法详解

Linux上通过SSH?#20197;?#36828;

在本篇内容里小编给大家整理了关于在Linux上通过SSH挂
虚拟机中ubuntu不能联网问题的解决方法

虚拟机中ubuntu不能联

这篇文章主要为大家详细介绍了虚拟机中ubuntu不能联网
?#31243;窷ginx10m+高并发内核优化详解

?#31243;窷ginx10m+高并发

这篇文章主要介绍了?#31243;窷ginx10m+高并发内核优化详解,
Ubuntu无法联网的解决方法

Ubuntu无法联网的解决

这篇文章主要为大家详细介绍了Ubuntu无法联网的解决方
幸运蛋蛋pc开奖 3d综合走势图 三分赛记录 快乐十分天津0705056 快玩游戏下载安装 快乐彩票平台计划群 足球即是揵报比分 广西快乐10分怎样开奖 曾道免费资料开奖结果人 彩票下载app送29 大家乐湖北麻将