ELK在Ubuntu上使用Docker安装-保姆级操作

Ubuntu20.04.6 离线安装 ELK 8.19.18 完整操作文档
下载地址:
https://www.elastic.co/downloads/past-releases#elasticsearch
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.19.18-amd64.deb
https://artifacts.elastic.co/downloads/kibana/kibana-8.19.18-amd64.deb
https://artifacts.elastic.co/downloads/logstash/logstash-8.19.18-amd64.deb

一、Elasticsearch安装
1、导入镜像包
# 进入目录
cd /opt/software
# 导入(装载)tar镜像
docker load -i elasticsearch-docker-8.19.18.tar
# 查看导入后的镜像名称
docker images | grep elasticsearch

2、创建持久化数据目录
mkdir -p /opt/elasticsearch/{data,logs,config,plugins}
# ES容器内部运行用户uid=1000,必须授权,否则权限拒绝无法写入
chmod -R 777 /opt/elasticsearch
# 严谨生产权限(可选,替代上面777)
sudo chown -R 1000:1000 /opt/elasticsearch

3、修改宿主机内核参数
# 追加配置到 sysctl.conf
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
# 使配置立即生效
sysctl -p
#查看文件是否写入
cat /etc/sysctl.conf

4、准备 elasticsearch.yml
若不需要密码,把绿色标记的安全认证那几行删除即可
cat > /opt/elasticsearch/config/elasticsearch.yml <<EOF
# 集群名称
cluster.name: docker-cluster
# 节点名称
node.name: es-node-1
# 允许外部网络访问
network.host: 0.0.0.0
# 单节点模式
discovery.type: single-node
# 开启跨域,方便 Kibana 或前端可视化工具连接
http.cors.enabled: true
http.cors.allow-origin: "*"
# 自动创建索引
action.auto_create_index: true
# 开启安全认证
xpack.security.enabled: true
# 关闭HTTP层SSL(内网测试,不用https)
xpack.security.http.ssl.enabled: false
# 节点间通信SSL不开心
xpack.security.transport.ssl.enabled: false
EOF
设置密码:

未设置密码

5、Docker run 启动命令
若不需要密码,把Password删除掉,把绿色的四行都更改为false即可
docker run -d \
--name es-node \
--restart always \
--ulimit memlock=-1:-1 \
--ulimit nofile=65535:65535 \
-p 9200:9200 \
-p 9300:9300 \
-v /opt/elasticsearch/data:/usr/share/elasticsearch/data \
-v /opt/elasticsearch/logs:/usr/share/elasticsearch/logs \
-v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-e "discovery.type=single-node" \
-e "ELASTIC_PASSWORD=asdf@1234" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "xpack.security.enabled=true" \
-e "xpack.security.enrollment.enabled=false" \
-e "xpack.security.http.ssl.enabled=false" \
-e "xpack.security.transport.ssl.enabled=false" \
docker.elastic.co/elasticsearch/elasticsearch:8.19.18 \
参数逐项解释
- --ulimit memlock=-1:-1 关闭 swap 内存锁定,非常关键,高写入必加
- --ulimit nofile 调高文件句柄,海量分片避免打开文件超限
- -p 9200:9200 HTTP 接口,业务、kibana、logstash 访问
- -p 9300:9300 集群内部通信端口,单机测试保留即可
- ES_JAVA_OPTS=-Xms512m -Xmx512m
堆内存设置规则:最大不超过 31G,Xms 与 Xmx 保持相同;根据服务器内存修改
例:服务器 64G 内存 → 设置 30g; 32G 内存设置 15g
- xpack.security.enabled=false 关闭账号密码、SSL,内网调试首选
- discovery.type=single-node 单机模式,不组建集群
- 用户名为:elastic 密码为:asdf@1234
6、常用检查命令
# 查看容器启动日志
docker logs -f es-node
未设置密码启动

设置密码启动

# 验证ES是否正常响应


若后续忘记了密码,无需重新创建容器,可以直接进入容器使用官方工具重置:
# 进入容器
docker exec -it es-node bash
# 重置 elastic 用户的密码(交互式输入新密码)
bin/elasticsearch-reset-password -u elastic -i
# 也可以直接进入容器执行修改密码
docker exec -it es-node /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i

二、kibana安装
1、加载本地 Kibana 镜像
# 导入tar镜像包
docker load -i /opt/software/kibana-docker-8.19.18.tar
# 确认镜像名称
docker images | grep kibana
# 正常镜像名称:docker.elastic.co/kibana/kibana:8.19.18

2、创建宿主机目录并配置权限
# 创建 Kibana 的配置和数据目录
mkdir -p /opt/kibana/{config,data}
# 设置目录权限(Kibana 容器内默认用户 UID 通常为 1000)
chown -R 1000:1000 /opt/kibana

3、生成kibana.yml 配置文件
若elasticsearch配置了密码,则kibana也要配置es的密码(在配置文件中增添绿色配置),用户名不能使用elastic,新版本 Kibana 强校验,禁止用 elastic 超级用户作为后台连接账号。可以为kibana单独生成一个用户名“kibana_system”和密码。密码生成在下面有说明
cat > /opt/kibana/config/kibana.yml <<EOF
# 允许外部网络访问
server.host: "0.0.0.0"
server.port: 5601
# ES访问地址,容器内使用宿主机IP
elasticsearch.hosts: ["http://192.168.150.99:9200"]
#设置es用户名及密码
elasticsearch.username: "kibana_system"
elasticsearch.password: "asdf@1234"
elasticsearch.ssl.verificationMode: none
# 中文界面
i18n.locale: "zh-CN"
EOF
无密码配置

设置密码

4、启动 Kibana 容器
若es配置了密码,kibana也必须配置密码,上面是在kibana.yml配置了密码,也可以直接在配置文件中删除用户名和密码这两行配置(elasticsearch.username: "kibana_system" elasticsearch.password: "asdf@1234"),直接在启动命令中加入绿色的配置。
docker run -d \
--name kibana \
--restart=always \
-p 5601:5601 \
-e "NODE_OPTIONS=--max-old-space-size=512" \
-e "ELASTICSEARCH_HOSTS=http://192.168.150.99:9200" \
-e "ELASTICSEARCH_USERNAME=kibana_system" \
-e "ELASTICSEARCH_PASSWORD=asdf@1234" \
-v /opt/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
-v /opt/kibana/data:/usr/share/kibana/data \
docker.elastic.co/kibana/kibana:8.19.18 \
参数解释
- -p 5601:5601:web 访问端口,浏览器访问 http://服务器IP:5601
- -v 单独映射yml:和 ES 方案一致,避免覆盖容器内整套配置文件
- /opt/kibana/data:持久化 Kibana 空间、仪表板、索引模式配置
- NODE_OPTIONS:限制 Kibana 内存,测试环境 1G 足够;多人使用可调整为 2048
若为kibana_system账号设置密码,可以在执行下面命令。(asdf@1234)
docker exec -it es-node /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -i

5、验证 Kibana 是否启动成功
docker logs -f kibana

6、访问
浏览器打开:http://192.168.150.99:5601

设置密码后,登录使用elastic账号,不能使用kibana_system账号,否则提示无权限。

7、生成加密密钥并写入 kibana.yml(可忽略)
此时,虽然启动成功,但会报错
Error: Unable to create alerts client because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command.
Kibana 8.x 强制要求 加密密钥,用于存储告警、监视任务等加密持久化数据
执行如下命令:
docker exec -it kibana /usr/share/kibana/bin/kibana-encryption-keys generate
执行后,终端会输出类似如下的三行配置(每次生成的密钥都是随机字符串)
xpack.encryptedSavedObjects.encryptionKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
xpack.security.encryptionKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
xpack.reporting.encryptionKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
将密钥写入宿主机配置文件(修改宿主机 /opt/kibana/config/kibana.yml,追加上面三行)

xpack.encryptedSavedObjects.encryptionKey: 21f66c17919bc1cea62f82043324649f0351af4f2795294f2924e831eebbd8a2
xpack.reporting.encryptionKey: ac5943bdbc2ef64c7b3ccbb43ceefa9597e019de0f59f9413ccd7d5ea54a864a
xpack.security.encryptionKey: d1df7dc948041fcd4c9165220a6cf11eb2f167281ff6d0ee7427e44f2d809351

重启 Kibana 容器
保存配置文件后,重启 Kibana 使配置生效:
docker restart kibana
日志里已经打印关键一行:
[2026-08-14T09:51:16.831+00:00][INFO ][status] Kibana is now available

三、logstash安装
1、加载 Logstash 离线镜像
docker load -i /opt/software/logstash-docker-8.19.18.tar

2、创建宿主机目录并赋权
mkdir -p /opt/logstash/{config,pipeline,data}
# 赋予读写权限,避免容器内权限不足
chmod -R 777 /opt/logstash

3、创建 logstash.yml 主配置
cat > /opt/logstash/config/logstash.yml <<EOF
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: ["http://192.168.150.99:9200"]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "asdf@1234"
EOF

4、创建管道配置文件 (logstash.conf)
cat > /opt/logstash/pipeline/logstash.conf <<EOF
input {
beats {
port => 5044
}
}
filter {
}
output {
elasticsearch {
hosts => ["http://192.168.150.99:9200"]
user => "elastic"
password => "asdf@1234"
index => "logstash-test-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
EOF

5、启动 Logstash
docker run -d \
--name logstash \
--restart=always \
-p 5044:5044 \
-p 9600:9600 \
-v /opt/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /opt/logstash/pipeline:/usr/share/logstash/pipeline \
-v /opt/logstash/data:/usr/share/logstash/data \
-e LS_JAVA_OPTS="-Xms512m -Xmx512m" \
docker.elastic.co/logstash/logstash:8.19.18 \
# 实时日志
docker logs -f logstash

6、验证
访问:http://192.168.150.99:9600/_node/pipelines

四、安装分词器
1、将分词器压缩包复制到 ES 容器中(容器名为 es-node)
docker cp /opt/software/elasticsearch-analysis-ik-8.19.18.zip es-node:/tmp/

2、进入容器并安装插件
docker exec -it es-node bash
3、安装插件(看到 -> Installed analysis-ik 字样,说明安装成功)
bin/elasticsearch-plugin install -b file:///tmp/elasticsearch-analysis-ik-8.19.18.zip

4、验证插件(输出 analysis-ik 即正常)
/usr/share/elasticsearch/bin/elasticsearch-plugin list

5、退出容器并重启 ES 服务,并重新启动es
exit
cd /opt/elk-compose
#重新启动es
docker compose restart es-node
#查看日期
docker compose logs -f elasticsearch

6、测试分词器
curl -k -u 'elastic:asdf@1234' -X POST "http://192.168.150.99:9200/_analyze" -H "Content-Type: application/json" -d '{
"analyzer": "ik_max_word",
"text": "软件研发工程师 Elasticsearch中文分词测试"
}'

五、ELK验证
场景一:直接向 ES 写入数据并查看
写入数据到ES
curl -X POST "http://192.168.150.99:9200/test-logs/_doc" \
-H "Content-Type: application/json" \
-u elastic:asdf@1234 \
-d '{
"message": "这是一条直接写入ES的测试日志",
"level": "INFO",
"app": "my-test-app",
"@timestamp": "2026-08-15T16:50:00.000Z"
}'

在 Kibana 界面中查看
- 浏览器打开 http://192.168.150.99:5601,使用 elastic / asdf@1234 登录。
- 在左侧导航栏点击 Stack Management(堆栈管理)。
- 在左侧菜单找到 Kibana -> Data Views(旧版本叫 Index Patterns / 索引模式)。
- 点击右上角 Create data view(创建数据视图)。
- Name 填写:test-logs-view。
- Index pattern 填写:test-logs*(注意带星号,表示匹配所有以 test-logs 开头的索引)。
- Timestamp field 选择:@timestamp,然后点击 Save data view to Kibana。
- 创建成功后,点击左侧导航栏的 Discover(发现),您就能在左侧看到刚刚创建的视图,右侧会直接展示您写入的那条 JSON 数据!


场景二:监听宿主机日志文件写入 ES 并查看
1. 准备一个测试日志文件
在宿主机上创建一个测试日志文件,并写入几行模拟日志:
mkdir -p /opt/test-logs
cat > /opt/test-logs/app-test.log <<EOF
2026-08-15 16:50:01 INFO 用户登录成功 user_id=1001
2026-08-15 16:50:02 ERROR 数据库连接超时 timeout=3000ms
2026-08-15 16:50:03 WARN 内存使用率过高 usage=85%
EOF

2. 新建Logstash配置以监听该文件
cat > /opt/logstash/pipeline/file-test-logs.conf <<EOF
input {
file {
path => "/var/log/app-logs/app-test.log"
start_position => "beginning" # 每次重启从头读取(仅测试用)
sincedb_path => "/dev/null"
type => "test-app-log" # 添加一个自定义类型,方便在 ES 中区分
}
}
filter {
# 可以在这里添加 grok 等解析规则
}
output {
elasticsearch {
hosts => ["http://192.168.150.99:9200"]
user => "elastic"
password => "asdf@1234"
index => "app-file-logs-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
EOF

3、重启 Logstash 并挂载日志目录
# 先停掉旧的logstash
docker stop logstash && docker rm -v logstash
#启动
docker run -d \
--name logstash \
--restart=always \
-p 5044:5044 \
-p 9600:9600 \
-v /opt/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /opt/logstash/pipeline:/usr/share/logstash/pipeline \
-v /opt/logstash/data:/usr/share/logstash/data \
-v /opt/test-logs:/var/log/app-logs:ro \
-e LS_JAVA_OPTS="-Xms512m -Xmx512m" \
docker.elastic.co/logstash/logstash:8.19.18 \
# 实时日志 (如果看到打印出写入的三行日志,说明采集成功。)
docker logs -f logstash

持续追加日志测试:
echo "2026-08-15 18:02:00 INFO 定时任务执行成功" >> /opt/test-logs/app-test.log

4、在 Kibana 中查看文件日志
- Kibana 的 Stack Management -> Data Views。
- 创建一个新的 Data View:
- Name: app-file-logs-view
- Index pattern: app-file-logs*
- Timestamp field: @timestamp
- 保存后进入 Discover,切换到这个新的 Data View,您就能看到 Logstash 从文件中采集到的三条日志了。

在数据视图中选择刚才创建的视图(app-file-logs-view)

更多推荐

所有评论(0)