本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2020年11月15日 统计字数: 4571字 阅读时间: 10分钟阅读 本文链接: https://soulteary.com/2020/11/15/view-container-logs-in-realtime.html ----- # 实时查看容器日志 介绍一款使用了几个月的开源小工具,[Dozzle](https://dozzle.dev/)。它是一款轻量、简单的容器日志查看工具。 本篇将简单介绍如何使用它,包括搭配 Traefik,以及如何快速从源码构建它。 ## 写在前面 这款工具相比较一些重量级的工具,比如 ELK 系列而言,实在是太轻量了,容器版本不过 10MB 左右大小。 主要原因是,它不存储和处理日志,仅仅提供实时查看功能,类似我们日常使用 `ps`、`top` 一样,使用它可以减少我们在服务器上低效执行 `docker logs` 或者 `docker-compose logs` 等类似命令的执行。 ![Dozzle 运行状态](https://attachment.soulteary.com/2020/11/15/running.png) 先来聊聊一般情况下,怎么用这个小工具。 ## 一般场景 一般场景下,启动它,提供一个我们可以访问的端口,和其他多数优秀的开源项目一样简单,只需要一条简单的命令: ```bash docker run --name dozzle -d --volume=/var/run/docker.sock:/var/run/docker.sock:ro -p 8888:8080 amir20/dozzle:latest ``` 这里和官方文档不同的是,在挂载 `docker.sock` 的时候,因为我们并不需要去操作该文件,所以建议加上 `ro` 只读的限制,避免出现一些我们不希望出现的意外情况,尤其是使用 `latest` 版本的时候。当然,实际使用中还是建议锁定镜像版本,并认真审查项目相关源码。 当然,考虑到可维护性,我们可以把它写成 compose 配置文件: ```yaml version: "3" services: dozzle: container_name: dozzle image: amir20/dozzle:latest volumes: - /var/run/docker.sock:/var/run/docker.sock:ro ports: - 8888:8080 ``` 将上面的内容保存为 `docker-compose.yml` ,使用 `docker-compose up` 启动程序;或者前文提到的 `docker run` 命令之后,我们便可以通过浏览器访问 `localhost:8888` 来查看当前相同机器(容器网卡)内的容器的实时日志,以及已停止容器的历史运行日志了。 因为容器的盛行,许多时候我们需要同时查阅多个服务的日志状态,Dozzle 支持“分屏”查看,还是很方便的。 ![Dozzle 日志分屏](https://attachment.soulteary.com/2020/11/15/split.png) 当然,还有常用的关键词搜索过滤、文本高亮。 ![Dozzle 关键词搜索](https://attachment.soulteary.com/2020/11/15/search.png) 在简单场景下,暴露端口是一个简单易行的方案,对于生产环境,我们一般选择按照域名或者目录提供服务,这个时候,Traefik 就是一个很好的选择方案。 ## 如何搭配 Traefik 使用 之前[关于 Traefik 的文章](https://soulteary.com/tags/traefik.html)已经有许多了,所以这里先展示一个简单适用于 Traefik 的配置: ```yaml version: "3.6" services: dozzle: container_name: dozzle image: dozzle:latest volumes: - /var/run/docker.sock:/var/run/docker.sock:ro # 仅标准 Linux 环境使用 # - /etc/localtime:/etc/localtime:ro # - /etc/timezone:/etc/timezone:ro environment: # Web 服务监听地址 - DOZZLE_ADDR=0.0.0.0:8080 # Web 服务目录位置 - DOZZLE_BASE=/ # 运行日志打印级别 - DOZZLE_LEVEL=info # 展示和缓存的日志条数 - DOZZLE_TAILSIZE=300 # 仅展示符合筛选条件的容器 # - DOZZLE_FILTER= expose: - 8080 restart: always networks: - traefik labels: - "traefik.enable=true" - "traefik.docker.network=traefik" - "traefik.http.routers.dozzle-web.entrypoints=http" - "traefik.http.routers.dozzle-web.rule=Host(`dozzle.soulteary.com`)" - "traefik.http.services.dozzle-web-backend.loadbalancer.server.scheme=http" - "traefik.http.services.dozzle-web-backend.loadbalancer.server.port=8080" logging: driver: "json-file" options: max-size: "10m" networks: traefik: external: true ``` 使用 `docker-compose up -d` 启动服务之后,便可以通过我们指定的域名进行访问了。 当然,如果在公网使用,不能确保日志中的内容是否包含敏感内容,可以参考[《使用 Docker 和 Traefik 搭建 GitLab(后篇)》](https://soulteary.com/2019/04/10/gitlab-was-built-with-docker-and-traefik-part-2.html)这篇文章,使用 Traefik 为服务简单添加一个访问验证。 这里额外提一下 Dozzle 的服务过滤参数 `DOZZLE_FILTER`,这个参数作者的实现很有意思,使用了 `url.ParseQuery` 方法构建了一个符合每天使用 Web 服务/ Restful 接口的开发者的习惯,支持“`&`、`,`”简单逻辑。 比如我要筛选展示使用 Traefik 进行服务发现和运行中的服务,可以这样写筛选条件:`status=running,label=traefik.docker.network`。 ## 如何从源码构建应用 实际使用过程中,我们可能需要定制代码,来实现一些特别的需求,作者很贴心的提供了多阶段构建脚本,不过估计不少同样身处国内的同学会因为网络客观原因无法顺利构建,这里记录一下如何简单快速的完成应用构建。 首先是获取源代码: ```bash git clone https://github.com/amir20/dozzle.git --depth=1 --branch=master ``` 使用 `--depth` 和 `--branch` 可以有效减少获取代码时的传输量,从而提高你的代码下载速度。 接着是针对原始的 Dockerfile 进行调整,让 Alpine 、Node 、Go 的相关依赖、软件获取。 ```diff diff --git a/Dockerfile b/Dockerfile index 9bce54e..eda3672 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,15 @@ # Build assets -FROM node:current-alpine as node +FROM node:14.15.0-alpine as node + +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 + +RUN echo '' > /etc/apk/repositories && \ + VER=$(awk -F= '$1=="VERSION_ID" { print $2 ;}' /etc/os-release | cut -d . -f 1,2) && \ + echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v${VER}/main" >> /etc/apk/repositories && \ + echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v${VER}/community" >> /etc/apk/repositories && \ + echo "Asia/Shanghai" > /etc/timezone RUN apk add --no-cache git openssh python make g++ util-linux @@ -7,6 +17,7 @@ WORKDIR /build # Install dependencies COPY package*.json yarn.lock ./ +RUN yarn config set registry https://registry.npm.taobao.org/ RUN yarn install --network-timeout 1000000 # Copy config files @@ -20,6 +31,19 @@ RUN yarn build FROM golang:1.15-alpine AS builder +ENV LANG en_US.UTF-8 +ENV LANGUAGE en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 + +RUN echo '' > /etc/apk/repositories && \ + VER=$(awk -F= '$1=="VERSION_ID" { print $2 ;}' /etc/os-release | cut -d . -f 1,2) && \ + echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v${VER}/main" >> /etc/apk/repositories && \ + echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v${VER}/community" >> /etc/apk/repositories && \ + echo "Asia/Shanghai" > /etc/timezone + +RUN go env -w GO111MODULE=on && \ + go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct + RUN apk add --no-cache git ca-certificates RUN mkdir /dozzle ``` 上面是我一般会做的镜像“加速”构建调整,执行下面的构建命令,稍等片刻,便能获得属于你的 Dozzle。 ```bash docker build -t dozzle:custom --build-arg TAG=custom . ``` ![Dozzle 定制构建](https://attachment.soulteary.com/2020/11/15/custom-build.png) ## 最后 希望本篇内容能解救不停登录服务器查看日志,或者耐着性子等云平台日志中心日志刷新的你。 --EOF