ELK日志平台 安装与部署:用 Docker Compose 起一套单节点
安装与部署:用 Docker Compose 起一套单节点
单节点编排适合开发、验证和中小规模生产;真正上量的生产环境要拆成独立集群,Master 与 Data 节点分离。下面是最小可用的编排方式。
- 确认宿主机内核参数。Elasticsearch 依赖大量内存映射文件,默认值几乎必然不够,先永久写入内核参数。
- 准备目录与密码:宿主机上建好
es-data、kibana-data两个卷目录,并想好一个强口令用于ELASTIC_PASSWORD。 - 写
docker-compose.yml,定义 elasticsearch、kibana、logstash 三个服务,Filebeat 通常不放在这里,它跑在业务机上。 - 启动并确认健康:先等 Elasticsearch 变绿,再确认 Kibana 能打开、Logstash 的 5044 端口在监听。
- 在业务机上装 Filebeat,指向 Logstash 的地址,重启后到 Kibana 里确认能看到新索引。
# 1. 内核参数:临时生效 + 永久生效
sudo sysctl -w vm.max_map_count=262144
echo 'vm.max_map_count=262144' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 2. docker-compose.yml(节选关键配置)
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.x
environment:
- discovery.type=single-node
- xpack.security.enabled=true
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
# JVM 堆建议设为容器内存的一半左右,且不要超过压缩指针的阈值(具体上限以官方文档为准)
- ES_JAVA_OPTS=-Xms4g -Xmx4g
ulimits:
memlock: { soft: -1, hard: -1 }
nofile: { soft: 65536, hard: 65536 }
volumes:
- ./es-data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.x
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- ELASTICSEARCH_USERNAME=kibana_system
- ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
ports:
- "5601:5601"
logstash:
image: docker.elastic.co/logstash/logstash:8.x
volumes:
- ./pipeline:/usr/share/logstash/pipeline
ports:
- "5044:5044"
# 3. kibana.yml 关键项
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "${KIBANA_PASSWORD}"
# 4. 启动与验证
docker compose up -d
curl -u elastic:${ELASTIC_PASSWORD} http://localhost:9200/_cluster/health?pretty
关于版本:镜像里的 8.x 只是占位,请替换成官方当前实际发布的版本号,四个组件必须保持同一个大版本,否则协议不兼容。
常见报错与处理
| 报错 | 原因 | 处理 |
|---|---|---|
max virtual memory areas vm.max_map_count [65530] is too low | 内核 vm.max_map_count 太小,ES 无法 mmap | 按上文写入 262144 并 sysctl -p,容器要重启 |
rejected execution of coordinating operation | 写入线程池队列打满,通常是瞬时写入洪峰或单个 bulk 过大 | 降低采集并发、加大 bulk 间隔、必要时扩数据节点 |
cluster_block_exception ... FORBIDDEN/12/index read-only / allow delete (api) | 磁盘达到水位线,ES 自动把索引置为只读保护数据 | 先清理磁盘或扩容,再解除 block(见排障命令) |
master_not_discovered_exception | 节点找不到主节点,常见于集群发现配置写错、脑裂后重启顺序不对 | 检查 discovery 配置与节点间网络,单节点必须写 discovery.type=single-node |
Kibana 报 Unable to connect to Elasticsearch | hosts 地址写成 localhost,容器内解析不到 | 容器编排里用服务名,如 http://elasticsearch:9200 |

