本文基于 Elastic 官方栈镜像,Ubuntu 24.04 实测(IP 192.168.1.10):主方案 7.17.2 已跑通;9.4.3 因宿主机 CPU 不支持 x86-64-v2 未能启动,文中仍给出 Compose 写法供有新 CPU 的环境参考。
应用日志散落各机、云日志按量又贵?ELK(Elasticsearch + Logstash + Kibana)是经典的开源日志检索与可视化栈——采集、索引、浏览器里搜图一气呵成,数据落在自己的服务器上。
本文用 轩辕镜像 Elastic 专属域名加速拉取,在 /data/elk 用 Docker Compose 联合部署三组件。国内拉取 docker.elastic.co 不能指望 daemon.json 的 registry-mirrors(只对 Docker Hub 生效),须在 image / docker pull 里显式写专属域,见 Elastic 拉取教程。
镜像页(可核对标签与简介):

图 1:Kibana 就绪后的 Welcome 页(可选 Explore on my own)
一、ELK 是什么?三个镜像怎么联合?
ELK 是 Elastic Stack 的俗称,由三个官方组件组成:
| 组件 | 作用 | 默认端口 | 轩辕镜像页 |
|---|---|---|---|
| Elasticsearch | 存储与全文检索、聚合 | 9200 / 9300 | elasticsearch |
| Logstash | 采集、过滤、写入 ES | 5044(Beats)等 | logstash |
| Kibana | Web 查询与仪表盘 | 5601 | kibana |
数据流:
textFilebeat / Syslog / 应用日志 │ ▼ Logstash 容器 ──写入──▶ Elasticsearch 容器(:9200) ▲ 浏览器 ──HTTP:5601──▶ Kibana 容器 ─┘(查询)
- Compose 同一网络内,用服务名
elasticsearch互访,不要写127.0.0.1。 - 三个镜像版本号必须一致(本文实测
7.17.2)。 - 可选扩展:同版本 Filebeat(
.../beats/filebeat:7.17.2)做采集端。
版本选型(务必先看)
- 旧 CPU / 虚拟机阉割指令集(无 SSE4.2,或报
CPU does not support x86-64-v2)→ 用本文 §三~§八 的 7.17.2。- 新 CPU(支持 x86-64-v2) → 可参考 §九 的 9.4.3 Compose;本文服务器未能实测跑通 9.4.3。
二、环境要求
| 项目 | 建议 |
|---|---|
| 系统 | Linux x86_64(本文 Ubuntu 24.04) |
| Docker | Engine 24+,Compose V2(docker compose) |
| 内存 | ES 堆默认 1g,整机建议 ≥ 4 GB 可用 |
| 内核 | vm.max_map_count >= 262144 |
| 端口 | 9200(ES)、5601(Kibana)、可选 5044 / 1514 |
| 工作目录 | /data/elk(与雷池 /data/safeline 并列) |
| 拉取域 | 轩辕 Elastic 专属域,例如 ***-elastic.xuanyuan.run(以你控制台为准) |
bashdocker --version docker compose version sudo sysctl -w vm.max_map_count=262144 # 永久:echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
未装 Docker 可用轩辕一键脚本:
bashbash <(wget -qO- https://xuanyuan.cloud/docker.sh)
更多见 轩辕镜像使用手册。
三、实测方案 A:部署 ELK 7.17.2(已跑通)
3.1 创建目录
与雷池同机时,可从任意目录建 ELK 目录:
bashmkdir -p /data/elk/logstash/pipeline cd /data/elk
实测提示符:root@ubuntu2404:/data/elk#
3.2 编写 docker-compose.yml
bashvim docker-compose.yml
内容(三镜像均为 7.17.2,实验环境关闭 security):
yamlservices: elasticsearch: image: ***-elastic.xuanyuan.run/elasticsearch/elasticsearch:7.17.2 container_name: elasticsearch restart: unless-stopped environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms1g -Xmx1g - xpack.security.enabled=false ulimits: memlock: soft: -1 hard: -1 volumes: - es-data:/usr/share/elasticsearch/data ports: - "9200:9200" networks: - elk healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -qE '\"status\":\"(green|yellow)\"'"] interval: 30s timeout: 10s retries: 10 start_period: 60s kibana: image: ***-elastic.xuanyuan.run/kibana/kibana:7.17.2 container_name: kibana restart: unless-stopped depends_on: elasticsearch: condition: service_healthy environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 # 可选:消除 publicBaseUrl 警告 # - SERVER_PUBLICBASEURL=http://192.168.1.10:5601 ports: - "5601:5601" networks: - elk logstash: image: ***-elastic.xuanyuan.run/logstash/logstash:7.17.2 container_name: logstash restart: unless-stopped depends_on: elasticsearch: condition: service_healthy volumes: - ./logstash/pipeline:/usr/share/logstash/pipeline:ro ports: - "5044:5044" - "1514:1514/udp" networks: - elk volumes: es-data: networks: elk: driver: bridge
将
***-elastic.xuanyuan.run换成你在轩辕控制台的 Elastic 专属域。
3.3 编写 .env
bashvim .env
envTZ=Asia/Shanghai
3.4 编写 Logstash pipeline
bashvim logstash/pipeline/main.conf
rubyinput { beats { port => 5044 } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] index => "logs-%{+YYYY.MM.dd}" } }
3.5 确认文件与镜像标签
bashls -la ls -la logstash/pipeline/ grep image docker-compose.yml
实测目录:
texttotal 20 drwxr-xr-x 3 root root 4096 Jul 17 09:13 . drwxr-xr-x 7 root root 4096 Jul 17 08:50 .. -rw-r--r-- 1 root root 1461 Jul 17 09:12 docker-compose.yml -rw-r--r-- 1 root root 17 Jul 17 09:13 .env drwxr-xr-x 3 root root 4096 Jul 17 08:50 logstash
textlogstash/pipeline/ -rw-r--r-- 1 root root 152 Jul 17 09:13 main.conf
textimage: ***-elastic.xuanyuan.run/elasticsearch/elasticsearch:7.17.2 image: ***-elastic.xuanyuan.run/kibana/kibana:7.17.2 image: ***-elastic.xuanyuan.run/logstash/logstash:7.17.2
3.6 拉取镜像
bashdocker compose pull
大镜像偶发 TLS handshake timeout 或 layer digest 校验失败时,再执行一次 docker compose pull 即可。实测最终成功:
text[+] Pulling 33/34 ✔ logstash Pulled 198.4s ✔ elasticsearch Pulled 112.9s ✔ kibana Pulled 127.3s
也可单独拉:
bashdocker pull ***-elastic.xuanyuan.run/elasticsearch/elasticsearch:7.17.2 docker pull ***-elastic.xuanyuan.run/logstash/logstash:7.17.2 docker pull ***-elastic.xuanyuan.run/kibana/kibana:7.17.2
3.7 启动
确保已设置 vm.max_map_count 后:
bashsudo sysctl -w vm.max_map_count=262144 docker compose up -d
实测输出:
text[+] Running 3/3 ✔ Container elasticsearch Healthy 44.4s ✔ Container kibana Started 44.3s ✔ Container logstash Started 44.5s
四、验证 Elasticsearch
浏览器或本机访问:
texthttp://192.168.1.10:9200/
应看到类似:
json{ "name": "ccacef2fe6f8", "cluster_name": "docker-cluster", "version": { "number": "7.17.2", "build_flavor": "default", "build_type": "docker", "lucene_version": "8.11.1" }, "tagline": "You Know, for Search" }
bashcurl http://127.0.0.1:9200/_cluster/health?pretty
五、打开 Kibana(5601)
访问:
texthttp://192.168.1.10:5601/
首次可能短暂出现 Kibana server is not ready yet(冷启动加载插件),等 2~5 分钟 再刷新。
就绪后进入 Welcome to Elastic(见图 1)。建议点 Explore on my own(自己探索);实验环境不必先走 Add integrations。右下角若提示缺少 server.publicBaseUrl,可 Mute,或在 compose 里给 Kibana 加上文注释中的 SERVER_PUBLICBASEURL。
进入主页后可见 Enterprise Search / Observability / Security / Analytics 等入口:

图 2:Welcome home — Enterprise Search / Observability / Security / Analytics

图 3:Enterprise Search 欢迎页

图 4:Security Overview

图 5:Analytics 欢迎页

图 6:Observability 欢迎页
至此 三容器已联合运行,浏览器可搜、可逛解决方案页。下面用官方样例数据快速验证可视化能力。
六、导入样例数据并逛仪表盘
路径:Integrations → Sample data(或主页 Try sample data),可添加 eCommerce / Flights / Web logs。

图 7:More ways to add data — Sample data
6.1 eCommerce 样例

图 8:[eCommerce] Revenue Dashboard

图 9:Canvas — [eCommerce] Revenue Tracking

图 10:Maps — [eCommerce] Orders by Country
6.2 Flights 样例

图 11:[Flights] Global Flight Dashboard

图 12:Canvas — [Flights] Overview

图 13:Maps — [Flights] Origin Time Delayed
6.3 Web logs 样例

图 14:[Logs] Web Traffic Dashboard

图 15:Canvas — [Logs] Web Traffic

图 16:Maps — [Logs] Total Requests and Bytes

图 17:Observability → Logs → Stream(样例 web logs 流)
真实业务日志:用 Filebeat 打到 Logstash :5044,或按 main.conf 扩展 input;索引名默认 logs-YYYY.MM.dd,在 Stack Management → Index Patterns 中创建匹配模式即可在 Discover 查询。
七、日常运维
bashcd /data/elk docker compose ps docker compose logs -f --tail=100 docker compose restart kibana docker compose down # 停栈,保留命名卷 # docker compose down -v # 危险:会删 es-data
升级小版本:改三个 image 标签为同一新版本 → docker compose pull && docker compose up -d。
跨大版本(如 7→9)不要复用旧数据卷,先备份再 docker volume rm elk_es-data 重建。
八、方案 B:ELK 9.4.3(Compose 参考 · 本文未实测跑通)
适用:CPU 支持 x86-64-v2(含 SSE4.2) 的机器。镜像页:
8.1 本文服务器上的失败实录(供对照)
- 首次 pull 曾遇 Kibana
TLS handshake timeout,重试后三镜像均 Pulled(约 10 分钟级)。 docker compose up -d报:dependency failed to start: container elasticsearch is unhealthy。- 日志根因:
textFatal glibc error: CPU does not support x86-64-v2
即 镜像用户态要求 x86-64-v2,当前宿主机/虚拟机 CPU 标志不满足。改 healthcheck、改密码均无效。随后清理容器与 9.4.3 镜像,改用 7.17.2 才跑通。
自检:
bashlscpu | grep -E 'Model name|Flags' grep -o 'sse4_2' /proc/cpuinfo | head -1
- 无
sse4_2→ 请用 7.17.2,或换机 / 虚拟机改 CPU 为host透传后再试 9.x。 - 有
sse4_2仍失败 → 检查是否虚拟机用了kvm64等阉割型号。
8.2 9.4.3 Compose 示例(未在本文机器验证)
开启基础 security,健康检查须带密码:
yamlservices: elasticsearch: image: ***-elastic.xuanyuan.run/elasticsearch/elasticsearch:9.4.3 container_name: elasticsearch restart: unless-stopped environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms1g -Xmx1g - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - xpack.security.enabled=true - xpack.security.http.ssl.enabled=false ulimits: memlock: soft: -1 hard: -1 volumes: - es-data:/usr/share/elasticsearch/data ports: - "9200:9200" networks: - elk healthcheck: test: ["CMD-SHELL", "curl -s -u elastic:$${ELASTIC_PASSWORD} http://localhost:9200/_cluster/health | grep -qE '\"status\":\"(green|yellow)\"'"] interval: 30s timeout: 10s retries: 10 start_period: 60s kibana: image: ***-elastic.xuanyuan.run/kibana/kibana:9.4.3 container_name: kibana restart: unless-stopped depends_on: elasticsearch: condition: service_healthy environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD=${ELASTIC_PASSWORD} ports: - "5601:5601" networks: - elk logstash: image: ***-elastic.xuanyuan.run/logstash/logstash:9.4.3 container_name: logstash restart: unless-stopped depends_on: elasticsearch: condition: service_healthy environment: - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} volumes: - ./logstash/pipeline:/usr/share/logstash/pipeline:ro ports: - "5044:5044" - "1514:1514/udp" networks: - elk volumes: es-data: networks: elk: driver: bridge
.env:
envELASTIC_PASSWORD=你的强密码
main.conf 输出需带账号:
rubyoutput { elasticsearch { hosts => ["http://elasticsearch:9200"] user => "elastic" password => "${ELASTIC_PASSWORD}" index => "logs-%{+YYYY.MM.dd}" } }
从 9.x 失败环境改回 7.x 时,务必清数据卷,避免大版本混用:
bashcd /data/elk docker compose down docker volume rm elk_es-data # 再改 compose 为 7.17.2 后 pull && up -d
九、FAQ
Q:registry-mirrors 配了轩辕,拉 Elastic 还是很慢?
A:registry-mirrors 只对 docker.io 生效。Elastic 必须写 ***-elastic.xuanyuan.run/...,见 Elastic 专属域教程。
Q:Fatal glibc error: CPU does not support x86-64-v2?
A:9.x 基线要求更高。换支持 SSE4.2 的机器 / VM host 透传,或改用 7.17.2(本文实测路径)。
Q:Kibana 一直 not ready yet?
A:先等几分钟;docker logs kibana;确认 ELASTICSEARCH_HOSTS=http://elasticsearch:9200;确认 ES 已 healthy。
Q:生产能关 xpack.security 吗?
A:本文 7.17.2 为内网实验关闭。生产请开启认证与 TLS,并限制 9200/5601 暴露范围。
Q:只需 ES + Kibana,不要 Logstash?
A:可以,从 compose 删掉 logstash 服务即可(有时称 EK);采集改由 Filebeat 直写 ES。
十、小结
| 项 | 内容 |
|---|---|
| 实测版本 | 7.17.2(ES / Logstash / Kibana) |
| 工作目录 | /data/elk |
| 访问 | ES http://IP:9200,Kibana http://IP:5601 |
| 加速 | 轩辕 ***-elastic.xuanyuan.run |
| 9.4.3 | Compose 已给出;本文 CPU 限制未跑通 |
| 截图 | 17 张(欢迎页 → 样例 eCommerce / Flights / Logs) |
日志私有化并不神秘:三镜像同一版本、同一 Compose 网络、专属域拉取,旧 CPU 选 7.17、新 CPU 再评估 9.x——浏览器打开 Kibana,就能开始搜和画图。
评论交流
免责声明
本博客文章所提供的内容、技术方案、配置示例及部署指南等信息,仅供学习交流和技术参考使用。文章内容基于发布时的技术环境和版本信息编写,可能因时间推移、技术更新或环境差异而存在不适用的情况。
用户在参考本博客内容进行部署操作前,应当充分了解相关技术风险,并建议在测试环境中进行充分验证和测试,确认无误后再考虑在生产环境中使用。生产环境部署前,请务必进行数据备份,并制定相应的回滚方案。
用户因使用本博客内容进行部署操作而产生的任何损失、数据丢失、系统故障、安全风险或其他问题,均由用户自行承担全部责任。轩辕镜像官方不对因使用本博客内容而产生的任何直接或间接损失承担责任。
本免责声明的最终解释权归轩辕镜像官方所有。
