Docker容器日志查看Docker logging driver-json-file、journalctl 以及Docker 容器 ping Temporary failure in name 问题

一、Docker容器日志查看Docker logging driver-json-file、journalctl 

    Docker启动容器后,默认Docker的日志会发送到容器的标准输出设备(STDOUT)和标准错误设备(STDERR),其中STDOUT和STDERR实际上就是容器的控制台终端。可以通过docker logs命令来查看某个容器输出的日志,具体如下:

#静态查看日志-不更新
docker logs 容器ID
#动态查看静态-实时更新
docker logs -f 容器ID

    虽然我们能查看日志,但这些日志存储在哪里呢?这里就需要提到Docker logging driver这个概念。Docker logging driver是Docker收集容器日志及内部运行服务的日志的机制,这些机制统称为logging drivers。可以通过docker info命令查看到(也许有的不能,可能只列出当前docker支持的日志机制)。Plugins: Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog

    上面在docker info命令结果中的Plugins项中Log里列出各项日志机制。docker官网有对应介绍:Configure logging drivers | Docker Docs

Driver Description
none No logs are available for the container and docker logs does not return any output.
local Logs are stored in a custom format designed for minimal overhead.
json-file The logs are formatted as JSON. The default logging driver for Docker.
syslog Writes logging messages to the syslog facility. The syslog daemon must be running on the host machine.
journald Writes log messages to journald. The journald daemon must be running on the host machine.
gelf Writes log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash.
fluentd Writes log messages to fluentd (forward input). The fluentd daemon must be running on the host machine.
awslogs Writes log messages to Amazon CloudWatch Logs.
splunk Writes log messages to splunk using the HTTP Event Collector.
etwlogs Writes log messages as Event Tracing for Windows (ETW) events. Only available on Windows platforms.
gcplogs Writes log messages to Google Cloud Platform (GCP) Logging.
logentries Writes log messages to Rapid7 Logentries.

    虽然可用的logging driver有很多,不过常见的主要是json-file和journald。可以通过docker info命令查找Logging Driver关键能看到当前的docker使用的是哪种机制,也可以通过这个值可以通过docker的daemon.json配置文件来进行修改。在docker inspect的结果中它就是包含在HostConfig.LogConfig.Type项中。

#通过inspect查看当前docker使用的日志机制
docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
#daemon.json中关于logging driver的配置
#cat /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

    然后根据当前的docker使用的日志机制来查看docker的日志。
    如果使用的是json-file机制:则docker启动后日志会在 /var/lib/docker/containers/容器ID/容器ID-json.log 位置,也可以通过 inspect 容器ID找到LogPath项即是日志文件路径。如果使用的是journalctl机制:则需要了解日志管理工具journalctl的使用,journalctl是centos7上专有的日志管理工具,它从message文件里读取信息。centos7中使用Systemd统一管理所有Unit的启动日志。然后可以只用journalctl一个命令来查看所有日志(可区分内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。在CoreOS中使用。

#查看docker容器日志。
journalctl -u docker.service
#通过容器特征查看具体容器日志
journalctl -u docker CONTAINER_TAG=mytag
journalctl -u docker CONTAINER_ID=13211dsdfwwq
journalctl -f -u docker CONTAINER_NAME=server9

二、Docker 容器 ping Temporary failure in name 问题 

    在启动的一个docker容器中,容器里 ping 外网的域名就是拼不通,提示:docker 容器里 ping  Temporary failure in name resolution。而在宿主机中却可以外网。

    我知道这是域名无法解析,应该是出在DNS的问题上,所以在启动容器时我特意加宿主机上的/etc/resolv.conf 挂载到了容器中,在容器里也可以查看到resolve.conf 配置正常,并且在容器中拼这个dns也是正常的,但是拼外网的域名就是不行。

    另外我之前使用过其它的临时办法,包括增加hosts配置,但这些都是临时的,后来慢慢发现很多域名都不能访问,我就开始尝试挂载 resolv.conf 文件,然而并没有解决。包括尝试修改 /etc/docker/daemon.json 文件添加 dns配置为8/114等,也没有成功。

    最后就在启动容器的时候指定了一下DNS 值来解决,启动容器后查看容器中的 resolv.conf 也成了指定的值。如下。但为什么挂载resolv.conf 不能成功呢。

--dns=114.114.114.114 \
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值