Docker Compose是最省事、最可控的部署方式,因其将进程隔离、网络互通、卷挂载固化在YAML中,避免二进制安装常见的权限、路径、配置加载顺序问题;三处必改项为:loki volumes映射需指向宿主机真实存在且权限正确的路径,promtail日志目录挂载须确保宿主机路径可读,grafana必须显式设置GF_SECURITY_ADMIN_PASSWORD;Loki配置中server.http_listen_port、storage_config.filesystem.directory、limits_config.ingestion_rate_mb三处不匹配会导致八成启动失败;Promtail需正确配置labels、__path__(双引号包裹)、clients.url(用服务名而非localhost)才能正常采集。

docker-compose 是最省事、最可控的部署方式,二进制安装 90% 的失败都卡在权限、路径、配置加载顺序上。
为什么不用二进制安装?
你得手动处理:loki-linux-amd64 和 promtail-linux-amd64 的执行权限、systemd 单元文件写错就静默退出、/etc/loki/config.yaml 不会被自动加载(必须显式传 --config.file)、日志目录挂载权限不一致导致静默丢日志。而 docker-compose 把进程隔离、网络互通、卷挂载全固化在 YAML 里,改端口、换路径、加标签只动几行。
docker-compose.yml 三处必改项
官方模板可直接用,但以下三项不调准挂:
-
loki服务的volumes必须映射到宿主机真实存在的路径,比如./loki-config/config.yaml:/etc/loki/local-config.yaml;路径不存在或权限不对,容器启动后立刻退出,docker logs loki只显示failed to load config -
promtail的日志目录映射要真实存在且有读权限,例如- /var/log:/var/log;如果宿主机/var/log属主不是root:adm,而容器默认以非 root 用户运行,就会跳过采集且不报错 -
grafana的GF_SECURITY_ADMIN_PASSWORD必须显式设置,否则 v10+ 版本首次登录卡死,UI 里也无法重设
loki-local-config.yaml 三个硬性配置点
Loki 启动失败八成因这三处没对齐:
-
server.http_listen_port:默认3100,若宿主机被占用(比如另一个 Loki 或 Nginx),必须同步改docker-compose.yml的ports映射,如"3101:3100";只改配置不改映射,Grafana 连不上 -
storage_config.filesystem.directory:必须是容器内绝对路径,如/tmp/loki/chunks;若指向/opt/loki/chunks却没做volumes挂载,Loki 启动时直接报permission denied -
limits_config.ingestion_rate_mb和ingestion_burst_size_mb:默认4/6,Nginx 或 Java 应用几秒就触发限速,promtail日志里反复出现rate limited;建议按实际流量设为30和15
promtail-config.yaml 标签和路径最容易漏
Promtail 不是“装上就收日志”,它靠 static_configs.labels 打流标识,靠 pipeline_stages 解析内容。漏掉任一环节,Grafana 就查不到:
-
labels至少含job和host,例如{job="system", host="${HOSTNAME}"};空labels: {}或全注释掉,Loki 直接丢弃该流 -
__path__必须用双引号包裹,尤其含变量或 glob 时:"__path__: "/var/log/**/*.log";单引号或不加引号会导致匹配失效 -
clients.url别写localhost——同机部署用http://loki:3100/loki/api/v1/push(Docker 网络内服务名),跨主机填目标 IP;不能依赖 DNS 或容器别名
复杂点在于 Promtail 自身日志输出不走 journalctl,查问题得进容器跑 curl -s <a href="https://www.php.cn/link/303d0012fd8d7ef9e9f6917dc6e938f0">https://www.php.cn/link/303d0012fd8d7ef9e9f6917dc6e938f0</a> | grep promtail_targets_active,值为 0 就说明根本没发现日志文件——这时候再回头检查路径、权限、<strong>path</strong> glob 写法。


















