Docker compose 启动 ELK-保姆级操作

先安装docker compose,把下载的 docker compose 拷贝到/opt/software目录下

老版本安装 docker-compose(V1)
# 将二进制文件移动到系统命令目录,重命名为 docker-compose
mv /opt/software/docker-compose-linux-x86_64-5.4.0 /usr/local/bin/docker-compose
# 添加执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version
新版本安装 docker-compose(V2插件)当前使用的版本
mkdir -p /usr/local/lib/docker/cli-plugins
mv /opt/software/docker-compose-linux-x86_64 /usr/local/lib/docker/cli-plugins/docker-compose
#查看版本
docker compose version

前提条件:装载ELK版本

docker load -i elasticsearch-docker-8.19.18.tar
docker load -i /opt/software/kibana-docker-8.19.18.tar
docker load -i /opt/software/logstash-docker-8.19.18.tar
镜像都要装载完毕
docker images

一、创建宿主机目录
mkdir -p /opt/elk-compose/elasticsearch/{data,logs,config}
mkdir -p /opt/elk-compose/kibana/{data,config}
mkdir -p /opt/elk-compose/logstash/{config,pipeline,data}
赋予权限
chown -R 1000:1000 /opt/elk-compose/elasticsearch /opt/elk-compose/kibana /opt/elk-compose/logstash

二、创建.env 文件
cat > /opt/elk-compose/.env <<EOF
# elastic 超级管理员密码
ELASTIC_PASSWORD=asdf@1234
# kibana_system 预设密码
KIBANA_SYSTEM_PASSWORD=asdf@1234
# ES JVM堆大小
ES_JAVA_XMS=512m
ES_JAVA_XMX=512m
# Kibana内存
KIBANA_MAX_OLD_SPACE=512
EOF
三、创建 docker-compose.yml
vim /opt/elk-compose/docker-compose.yml
内容如下:
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.19.18
container_name: es-node
restart: always
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65535
hard: 65535
environment:
discovery.type: single-node
ES_JAVA_OPTS: "-Xms${ES_JAVA_XMS} -Xmx${ES_JAVA_XMX}"
ELASTIC_PASSWORD: "${ELASTIC_PASSWORD}"
ports:
- "9200:9200"
- "9300:9300"
volumes:
- /opt/elk-compose/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /opt/elk-compose/elasticsearch/data:/usr/share/elasticsearch/data
- /opt/elk-compose/elasticsearch/logs:/usr/share/elasticsearch/logs
networks:
- elastic-net
kibana:
image: docker.elastic.co/kibana/kibana:8.19.18
container_name: kibana
restart: always
environment:
NODE_OPTIONS: "--max-old-space-size=${KIBANA_MAX_OLD_SPACE}"
ELASTICSEARCH_HOSTS: "http://elasticsearch:9200"
ELASTICSEARCH_USERNAME: "kibana_system"
ELASTICSEARCH_PASSWORD: "${KIBANA_SYSTEM_PASSWORD}"
ports:
- "5601:5601"
volumes:
- /opt/elk-compose/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
- /opt/elk-compose/kibana/data:/usr/share/kibana/data
depends_on:
- elasticsearch
networks:
- elastic-net
logstash:
image: docker.elastic.co/logstash/logstash:8.19.18
container_name: logstash
restart: always
depends_on:
elasticsearch:
condition: service_started
environment:
LS_JAVA_OPTS: "-Xms512m -Xmx512m"
ports:
- "5044:5044" # beats端口
- "9600:9600" # logstash监控api
volumes:
- type: bind
source: /opt/logstash/config/logstash.yml
target: /usr/share/logstash/config/logstash.yml
bind:
#如果宿主机上的source路径不存在,Docker会自动创建文件或目录
create_host_path: true
- type: bind
source: /opt/logstash/pipeline
target: /usr/share/logstash/pipeline
bind:
create_host_path: true
- type: bind
source: /opt/logstash/data
target: /usr/share/logstash/data
bind:
create_host_path: true
- type: bind
source: /opt/test-logs
target: /var/log/app-logs
bind:
create_host_path: true
networks:
- elastic-net
networks:
elastic-net:
driver: bridge


四、配置文件
4.1、配置elasticsearch文件
cat > /opt/elk-compose/elasticsearch/config/elasticsearch.yml <<EOF
# 集群名称
cluster.name: docker-cluster
# 节点名称
node.name: es-node-1
# 允许外部网络访问
network.host: 0.0.0.0
# 开启跨域,方便 Kibana 或前端可视化工具连接
http.cors.enabled: true
http.cors.allow-origin: "*"
# 自动创建索引
action.auto_create_index: true
# 开启安全认证
xpack.security.enabled: true
xpack.security.enrollment.enabled: false
# 关闭HTTP层SSL
xpack.security.http.ssl.enabled: false
# 节点间通信SSL
xpack.security.transport.ssl.enabled: false
EOF

4.2、配置kibana文件
cat > /opt/elk-compose/kibana/config/kibana.yml <<EOF
# 允许外部网络访问
server.host: "0.0.0.0"
server.port: 5601
elasticsearch.ssl.verificationMode: none
# 中文界面
i18n.locale: "zh-CN"
EOF

4.3、创建 logstash.yml 主配置
cat > /opt/elk-compose/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.4、创建管道配置文件 (logstash.conf)
cat > /opt/elk-compose/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

4.5、初始化脚本 init-es.sh
vim /opt/elk-compose/init-es.sh
内容如下:
#!/bin/bash
set -e
# 加载环境变量
source .env
ES_URL="http://192.168.150.99:9200"
MARK_FILE="./.init_finished"
# 已经初始化过直接退出
if [ -f "${MARK_FILE}" ]; then
echo " 检测到已完成初始化,跳过"
exit 0
fi
echo "等待 Elasticsearch 启动就绪..."
until curl -s -u elastic:${ELASTIC_PASSWORD} "${ES_URL}/_cluster/health" > /dev/null; do
sleep 3
echo "ES尚未就绪,继续等待..."
done
echo "ES就绪,开始设置 kibana_system 用户密码"
# REST API 修改 kibana_system 密码(非交互式)
curl -s -X PUT "${ES_URL}/_security/user/kibana_system/_password" \
-u elastic:${ELASTIC_PASSWORD} \
-H "Content-Type: application/json" \
-d "{\"password\":\"${KIBANA_SYSTEM_PASSWORD}\"}"
echo "kibana_system 密码设置完成:${KIBANA_SYSTEM_PASSWORD}"
touch "${MARK_FILE}"
echo " 重启 Kibana 加载认证配置"
docker compose restart kibana
echo "全部初始化流程结束!"
echo " Kibana网页登录账号:elastic / ${ELASTIC_PASSWORD}"


#添加执行权限:
chmod +x /opt/elk-compose/init-es.sh
五、删除原来的容器(若没用启动过容器,可忽略)
docker rm -v -f kibana es-node logstash
六、校验配置文件
若文件原样输出,表示没用错误
cd /opt/elk-compose
docker compose config
七、一键启动:
docker compose up -d
八、查看运行状态:
docker compose ps

# 实时跟踪全部日志
docker compose logs -f
此时kibana还无法访问,需要执行./init-es.sh初始化密码
cd /opt/elk-compose
./init-es.sh

重启 kibana 服务加载配置
docker compose restart kibana
# 查看日志
docker compose logs -f elasticsearch
docker compose logs -f kibana
docker compose logs -f logstash

九、验证
9.1、验证ES
访问 http://192.168.150.99:9200/


9.2、验证kibana
用户名:elastic 密码:asdf@1234


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

9.4、ELK验证
写入数据到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中查看
get /test-logs/_search

在 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 数据!


十、其他命令
启停相关
# 后台启动所有服务(最常用)
docker compose up -d
# 前台启动,打印日志(调试用,Ctrl+C停止)
docker compose up
# 启动指定单个服务
docker compose up -d elasticsearch
# 正常停止容器(保留数据、网络、卷)
docker compose stop
# 只停止单个服务
docker compose stop kibana
# 重启全部服务
docker compose restart
# 重启指定服务
docker compose restart kibana
# 停止并删除【容器+网络】,宿主机挂载目录不会删除
docker compose down
# down同时一并删除命名数据卷(慎用!会清空ES数据)
docker compose down -v
日志查看
# 实时跟踪全部日志
docker compose logs -f
# 只跟踪 kibana 日志
docker compose logs -f kibana
# 只看es最近100行并持续刷新
docker compose logs --tail=100 -f elasticsearch
# 查看历史日志,不阻塞
docker compose logs elasticsearch
信息查看
# 校验yml语法,输出解析后的完整配置(你之前用过)
docker compose config
# 列出当前运行的容器
docker compose ps
# 查看所有状态(包含已停止)
docker compose ps -a
# 查看项目内镜像列表
docker compose images
进入容器交互终端
# 进入es容器
docker compose exec elasticsearch bash
# 进入kibana容器
docker compose exec kibana bash
删除清理
# 删除已停止的容器
docker compose rm
# 强制删除,不需要交互确认
docker compose rm -f
更多推荐
所有评论(0)