背景

在运行容器的时候,难免会遇到容器启动失败、或者想查看容器日志的情景,但是容器与直接安装在服务器上的服务又不太一样,那么该如何查看容器的日志呢?

docker logs

惯例,还是先推荐docker logs官方文档,建议大家有需要的话还是去官方文档看一看,虽然全是英文,翻译一下总没问题的嘛:

该命令仅适用于使用json-filejournald日志记录驱动程序启动的容器 。

用法
1
docker logs [OPTIONS] CONTAINER
参数说明
参数 描述
–details 显示提供给日志的其他详细信息
–follow /-f 跟踪日志输出
–since 显示自时间戳记以来的日志(例如2013-01-02T13:23:37)或相对记录(例如42m的42分钟)
–tail 从日志末尾开始显示的行数
–timestamps /-t 显示时间戳
–until 在时间戳(例如2013-01-02T13:23:37)或相对时间戳(例如42m持续42分钟)之前显示日志
例子

最简单直接的使用方法当然是:

1
[root@localhost ~]# docker logs nginx

nginx即为容器自定义的name,但是这样使用会将Nginx容器的所有日志全部打印出来,不是很符合实际应用的场景,所以需要结合部分参数来达到自己的目的。

因为我主要是在java_web方面,所以这里举例实时查看tomcat日志:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# docker logs -f --tail 10 tomcat
Mar 30, 2020 11:44:12 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [269] ms
Mar 30, 2020 11:44:12 AM org.apache.catalina.ha.session.JvmRouteBinderValve startInternal
INFO: JvmRouteBinderValve started
Mar 30, 2020 11:44:12 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8280"]
Mar 30, 2020 11:44:13 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8009"]
Mar 30, 2020 11:44:13 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 112825 ms

-f表示跟踪日志输出,–tail 10表示开始只打印容器日志的后10行,防止日志内容太多加载太久,tomcat为容器名,也可使用容器id。

Portainer

Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。

而部署portainer也是十分简单:

  • 拉取portainer镜像

    1
    docker pull portainer
  • 运行portainer容器

    1
    docker run -d -p 9000:9000 --name prtainer docker.io/portainer/portainer:latest

访问服务ip+端口9000,进行简单的设置,在portainer的logs界面即可看到容器的日志,也是十分方便。

挂载

如果觉得docker logs、portainer不太适合,也可以在运行容器时将对应服务的默认日志目录挂载至服务器的指定目录,那么在运行容器时,直接查看自己指定的目录即可,当然,这种方式仅适合你对该服务很了解,比如Nginx的默认日志目录在/etc/logs/nginx下,Tomcat默认日志目录在/usr/local/tomcat/logs/下。

ELK

最后推荐一下使用elasticsearch+logstash+kibana的方案,与Docker结合使用,效果更佳,这里就不细细展开了。