用Docker快速搭建Grafana Loki日志系统实战
Grafana Loki 是一套轻量级日志聚合系统,和 Grafana 配合使用,可以像查指标一样查日志。
如果你想在单台服务器上快速看到日志效果,用 Docker Compose 部署是最省事的方式。
本文按零基础路径,从准备环境到采集 Nginx 日志、再到查询验证,一步步执行即可。
准备条件与部署前确认
先确认服务器已安装 Docker 和 Docker Compose,并放行后续需要访问的端口。
建议使用一台 Linux 服务器,内存不低于 2GB,磁盘预留 20GB 以上,因为日志会持续写入。
执行以下命令检查环境:
docker -v
docker compose version
如果 docker compose version 报错,说明 Compose 插件未安装,需要先补装。
确认无误后,创建部署目录:
mkdir -p /opt/loki-demo && cd /opt/loki-demo
编写 Loki 与 Grafana 的 Compose 配置
Loki 需要一份配置文件,定义监听地址和存储路径。
先写 loki-config.yaml:
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
再写 docker-compose.yml,把 Loki 和 Grafana 放到同一网络:
services:
loki:
image: grafana/loki:latest
container_name: loki
ports:
- "3100:3100"
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
- ./loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
depends_on:
- loki
启动服务:
docker compose up -d
docker compose ps
两个容器状态为 running 即表示启动成功。
浏览器访问 http://服务器IP:3000,默认用户名 admin,密码为上面配置的 admin123。
在 Grafana 中添加 Loki 数据源
登录后进入左侧菜单,点击 Connections,搜索 Loki,选择 Add new data source。
在 Connection 一栏填写 http://loki:3100,因为两个容器在同一 Compose 网络内,用服务名即可互通。
点击 Save & test,出现成功提示说明数据源已通。
如果这一步报错,先检查 Loki 容器日志:
docker logs loki --tail 50
常见原因是配置文件路径写错或端口被占用,按日志提示修正后重启即可。
采集 Nginx 日志并查询验证
Loki 本身不采集日志,需要配合 Promtail 或 Alloy 把日志推送给它。
这里用 Promtail 采集本机 Nginx 的 access.log。
先在 docker-compose.yml 中追加一个服务:
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /var/log/nginx:/var/log/nginx:ro
- ./promtail-config.yaml:/etc/promtail/config.yaml
command: -config.file=/etc/promtail/config.yaml
depends_on:
- loki
再写 promtail-config.yaml:
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: nginx
static_configs:
- targets:
- localhost
labels:
job: nginx
__path__: /var/log/nginx/*.log
重新启动:
docker compose up -d
访问一次你的 Nginx 站点产生新日志,然后在 Grafana 中进入 Explore,数据源选 Loki,查询框输入:
{job="nginx"}
点击 Run query,能看到日志行即表示采集链路正常。
想按关键字过滤,可以写成:
{job="nginx"} |= "404"
容易踩的坑和排查顺序
权限问题:Promtail 读取 /var/log/nginx 时可能因为容器内用户权限不足而读不到文件,表现为查询无结果。
可以先确认宿主机上该目录是否对运行容器的用户可读,必要时调整目录权限或改用 root 运行做验证,生产环境再收紧。
时间不同步:Loki 按时间戳存储日志,服务器时间偏差过大时,Grafana 里可能查不到刚产生的日志。
执行 date 确认时间,必要时同步系统时间。
标签基数过高:不要把请求 ID、用户 IP 这类高基数字段放进标签,否则会拖慢查询并占用大量内存。
需要筛选时用 LogQL 过滤表达式,而不是做成标签。
数据盘写满:Loki 默认不自动清理旧日志,长期运行要配置保留周期或定期清理 loki-data 目录,避免磁盘被写满导致服务异常。
验证与后续调整
完成以上步骤后,用三个动作确认整套系统可用:一是 docker compose ps 三个容器都在运行;
二是在 Grafana Explore 中用 {job="nginx"} 能查到实时日志;
三是用 |= 关键字过滤能缩小结果范围。
单机小规模场景下,这套 Docker 方案足够跑通 Grafana Loki 实战流程。
后续如果日志量增大,可以再考虑接入对象存储、增加副本或拆分读写组件,但不必一开始就上复杂架构。
常见疑问
Loki 和 Elasticsearch 有什么区别? Loki 只对标签建索引,日志正文不建全文索引,因此资源占用更低,适合按标签快速定位;
需要复杂全文检索时 Elasticsearch 更合适。
必须用 Promtail 采集吗? 不是。
Grafana 生态里也可以用 Alloy,或通过 HTTP 接口直接推送日志,选择取决于你的采集环境和维护习惯。
Grafana 打不开怎么查? 先执行 docker logs grafana --tail 50 看启动日志,再确认 3000 端口是否被占用或防火墙是否放行。