- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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 查看容器的日志输出,大概如下:
1
|
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(如果没有就手工创建一个),增加下面内容:
1
2
3
4
5
6
|
{
"log-opts": {
"max-size": "1m",
"max-file": "3"
}
}
|
修改完成后重启docker服务:
1
2
|
systemctl daemon-reload
systemctl restart docker.service
|
测试一下新的日志策略,使用下面的命令创建一个容器:
1
|
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 : 默认以微秒。 。
1
|
1s = 1000ms = 1000000us
|
按照前文中查看日志文件的方法 。
1
2
3
4
5
6
7
8
9
|
# 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可以看到下面内容:
1
2
|
error_log /var/log/nginx/error.log warn;
access_log /var/log/nginx/access.log main;
|
也就是nginx会将错误日志和访问日志写入对应的日志文件。继续查看/var/log/nginx目录:
1
2
3
4
5
6
|
/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文件,其中有:
1
2
3
|
# 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容器 。
1
|
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,从脚本中发现:
1
2
3
|
echo
'Initializing database'
"$@"
--initialize-insecure
echo
'Database initialized'
|
这样就是mysql容器启动时候的输出对应起来了。entrypoint.sh比较复杂,主要功能就是启动mysqld,并将日志输出,因为不是本文重点,就不详细介绍了.
总结 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://juejin.im/post/5c96f546e51d456a67431445 。
最后此篇关于Docker 容器日志分析的文章就讲到这里了,如果你想了解更多关于Docker 容器日志分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这是我想做的 1 - 点击提交 2 - 隐藏 DIV 容器 1 3 - 显示 DIV 容器 2 4 - 将“PricingDisclaimer.php”中找到的所有 DIV 加载到 Div 容器 2
我有一个 ios 应用程序,它使用 iCloudcontainer 来保存用户的一些数据,例如用户的“到期日期”。我要用不同的方式创建应用程序的副本开发者账号。我要将用户从第一个应用程序迁移到第二个应
这是场景。 我有三个容器。 Container1、container2 和 container3(基于 Ubuntu 的镜像),其中 container2 充当容器 1 和容器 2 之间的路由器。 我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我正在改造管道以使用声明式管道方法,以便我能够 to use Docker images在每个阶段。 目前我有以下工作代码,它执行连接到在 Docker 容器中运行的数据库的集成测试。 node {
我正在开发一个需要尽可能简单地为最终用户安装的应用程序。虽然最终用户可能是经验丰富的 Linux 用户(或销售工程师),但他们对 Tomcat、Jetty 等并不真正了解,我认为他们也不应该了解。 所
我从gvisor-containerd-shim(Shim V1)移到了containerd-shim-runsc-v1(Shim V2)。在使用gvisor-containerd-shim的情况下,
假设我们只在某些开发阶段很少需要这样做(冒烟测试几个 api 调用),让项目 Bar 中的 dockerized web 服务访问 Project Foo 中的 dockerized web 服务的最
各位,我的操作系统是 Windows 10,运行的是 Docker 版本 17.06.0-ce-win19。我在 Windows 容器中运行 SQL Server Express,并且希望将 SQL
谁能告诉我,为什么我们不能在 Azure 存储中的容器内创建容器?还有什么方法可以处理,我们需要在 azure 存储中创建目录层次结构? 最佳答案 您无法在容器中创建容器,因为 Windows Azu
#include template struct Row { Row() { puts("Row default"); } Row(const Row& other) { puts
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
RDF容器用于描述一组事物 例如,把一本书的所有作者列在一起 RDF容器有三种类型: <Bag> <Seq> <Alt> <rdf:
编辑:从到目前为止添加的答案和评论看来,我没有正确解释我想要什么。下面是一个例子: // type not supporting any type of comparison [] [] type b
我正在测试 spatie 的异步项目。我创建了一个这样的任务。 use Spatie\Async\Task; class ServiceTask extends Task { protecte
我想使用 Azure Blob 存储来上传和下载文档。有一些公司可以上传和下载他们的文档。我想保证这些文件的安全。这意味着公司只能看到他们的文件。不是别人的。 我可以在 blob 容器中创建多个文件夹
我正在尝试与 Azure 中的容器实例进行远程交互。我已执行以下步骤: 已在本地注册表中加载本地镜像 docker load -i ima.tar 登录远程 ACR docker登录--用户名--密码
我正在研究http://progrium.viewdocs.io/dokku/process-management/,并试图弄清楚如何从单个项目中运行多个服务。 我有一个Dockerfile的仓库:
我有一个想要容器化的单体应用程序。文件夹结构是这样的: --app | |-file.py <-has a variable foo that is passed in --configs
我正在学习 Docker,并且一直在为 Ubuntu 容器制作 Dockerfile。 我的问题是我不断获取不同容器之间的持久信息。我已经退出,移除了容器,然后移除了它的图像。在对 Dockerfil
我是一名优秀的程序员,十分优秀!