一、背景:公司有一个需求,就是将txt中的数据加载到es中,之前没用过es,想着先在本地安装一个,然后再做测试。
二、安装docker desktop
打开docker的官网,下载苹果芯片的docker
网址:https://www.docker.com/
然后就是为了安装ELK的准备工作了
首先,把内存调大一些,要不然后续会有内存不足的问题
为了以后安装其他镜像文件也快一些,一般我们都用国内的镜像源,镜像源有很多,我用的是阿里云的镜像源,但是这个相对来说麻烦一些,需要先申请阿里云的镜像加速器
阿里云的网址:https://www.aliyun.com/
下面的是怎么找到自己申请的阿里云的镜像加速器
下面介绍一下docker desktop配置阿里云的镜像加速器
选择docker engine
增加内容如下;
"registry-mirrors": [
"你的专属阿里云镜像加速器地址"
]
注意:删除“experimental": false, 后的内容,并添加在其后。在"registry-mirrors"的上一行的末尾需要添加一个英文状态下的逗号,否则会提示有语法错误。
看看修改前和修改后的配置文件
修改前:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
}
}
修改后:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"你的专属阿里云镜像加速器地址"
]
}
然后点击这个按钮,让配置文件修改生效
验证修改的配置文件是否生效?在终端下输入命令:docker info
显示出来你配置的阿里云镜像加速器地址则说明配置文件修改成功了
~/Downloads docker info ✔ base Py at 08:42:20
Client:
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc., v0.10.4)
compose: Docker Compose (Docker Inc., v2.17.2)
dev: Docker Dev Environments (Docker Inc., v0.1.0)
extension: Manages Docker extensions (Docker Inc., v0.2.19)
init: Creates Docker-related starter files for your project (Docker Inc., v0.1.0-beta.2)
sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc., 0.6.0)
scan: Docker Scan (Docker Inc., v0.25.0)
scout: Command line tool for Docker Scout (Docker Inc., v0.9.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.24
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc version: v1.1.4-0-g5fd4c4d
init version: de40ad0
Security Options:
seccomp
Profile: default
cgroupns
Kernel Version: 5.15.49-linuxkit
Operating System: Docker Desktop
OSType: linux
Architecture: aarch64
CPUs: 6
Total Memory: 23.45GiB
Name: docker-desktop
ID: 4K24:DB2B:6Y2C:UW6F:K62N:EXBN:K2GN:MRSB:DCQI:X457:JSNX:NWYE
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
hubproxy.docker.internal:5555
127.0.0.0/8
Registry Mirrors:
你的专属阿里云镜像加速器地址
Live Restore Enabled: false
docker常用命令汇总(没咋用过docker,以后慢慢更新)
命令 | 命令说明 |
---|---|
docker info | |
docker info | |
docker info | |
docker info | |
docker info | |
docker info | |
docker info | |
docker info |
三、docker desktop安装elasticsearch
然后在这里搜索arm64v8/elasticsearch找自己想要安装的版本
然后就是选择一个版本进行下载
选择好版本以后,就可以往下拉镜像文件了
下面的两种方式都可以
一、直接点击PULL
二、在终端下执行
docker pull arm64v8/elasticsearch:7.17.6
然后在终端下执行 docker images 显示如下;
docker images是查询镜像的意思
然后按照官网的说法,先创建一个网络
创建网络的目的就是利用这个网络实现es、kibanna、logstash容器之间的通信,也可以这么理解,相当于一个局域网,内网的开发环境(😄,先这么理解吧)
docker network create somenetwork
执行完显示如下;
571029f86e441b2e5f2d0b682345489943c0c696b2a44c6572b6e6a3f260c287
在终端下执行运行elasticsearch的命令
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.17.6
执行完显示如下;
Unable to find image 'elasticsearch:7.17.6' locally
7.17.6: Pulling from library/elasticsearch
Digest: sha256:6c128de5d01c0c130a806022d6bd99b3e4c27a9af5bfc33b6b81861ae117d028
Status: Downloaded newer image for elasticsearch:7.17.6
85cb69aec5e49f0156f461a13b65209cc8a58ccaf61e03fcdaf8526c211de829
执行参数说明
参数 | 参数说明 |
---|---|
-d | 后台运行容器 |
–name | 指定容器别名 |
–net | 连接指定网络 |
-p | (小写)映射端口号,主机端口:容器端口 |
-P | (大写)随机为容器指定端口号 |
-e | 指定启动容器时的环境变量 |
-v | 进行容器的挂载 |
–privileged=true | 使容器有权限挂载目录 |
可以查看elasticsearch的状态,命令:docker ps
~ docker ps ✔ took 21s base Py at 10:54:11
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85cb69aec5e4 elasticsearch:7.17.6 "/bin/tini -- /usr/l…" 17 seconds ago Up 17 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
最后去浏览器中输入:地址如下,则说明elasticsearch安装成功了
也可以这么验证:在终端下输入,curl http://localhost:9200
上面的这种方法安装倒是简单,但是数据容易丢失,所以一般我们进行安装时,都采用挂载的方式进行,将容器中的配置文件和数据目录都挂载到宿主机上
首先查看在docker容器内的配置文件在什么位置
docker exec -it elasticsearch /bin/bash //进入容器内部,看左面的用户就可以看出来了,原来是root,现在是一堆字符串了
pwd:可以看到目前所在的目录
进入到config目录,就能看到容器内的配置文件位置了
该配置文件现在写的很简单
在本地新建es配置文件和数据文件要放的目录
我要创建挂载数据的位置
/Users/wuzhanxi/mac_soft/system_soft/code_environment //我本地的目录如下
在上面的目录下新建
es_out_disk/elasticsearch //配置文件放的位置
es_out_disk/elasticsearch/data //数据存放的位置
将容器内
# 将容器内的配置文件拷贝到 /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/elasticsearch中
#执行下面的命令
docker cp elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/elasticsearch/
# 修改文件权限
chmod 777 /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/elasticsearch/elasticsearch.yml //外部的配置文件需要有写的权限,我就配置成777了
# 在elasticsearch 目录下再创建data目录(存放数据的目录),同时修改权限
chmod -R 777 /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/elasticsearch/data
注意:这里要修改文件的权限为可写,否则,进行挂载后,在外部修改配置文件,容器内部的配置文件不会更改。同时,创建 data 目录进行挂载。
运行容器如下
# 先删除旧的容器
docker rm -f elasticsearch (删除这里写上容器的ID就可以)
# 运行新的容器
docker run -d --name elasticsearch \
--net somenetwork \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
--privileged=true \
-v $PWD/es_out_disk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v $PWD/es_out_disk/elasticsearch/data/:/usr/share/elasticsearch/data \
elasticsearch:7.17.6
注意:$PWD,在不同路径下,你的写法是不一样的,直接去掉也可以,写成全路径
下面演示一下,修改外部的配置文件,都有哪些地方会有变化
现在的配置文件只有这两行
cluster.name: "docker-cluster"
network.host: 0.0.0.0
我修改cluster.name为wzx-es
然后我重新启动这个容器,看看容器内部的配置文件是否发生了变化
docker exec -it elasticsearch /bin/bash //进入容器
发现已经变化了
root@cceb1eae3509:/usr/share/elasticsearch/config# cat elasticsearch.yml
cluster.name: "wzx-es"
network.host: 0.0.0.0
然后去浏览器端访问,发现集群的名称也变化了,说明配置容器内部和外部的映射没有问题了
四、docker desktop安装kibana
安装方式跟es差不多
启动命令:在终端下执行
docker run -d --name kibana --net somenetwork -p 5601:5601 kibana:7.17.6
执行完显示如下;
Unable to find image 'kibana:7.17.6' locally
7.17.6: Pulling from library/kibana
Digest: sha256:ae5a501355903443b6cc7ff4a3af2dd76ba73f986d0612014b8370cd04bb6da8
Status: Downloaded newer image for kibana:7.17.6
67f5096b644fd38f8bcd9a659851e8ed1e2b895a9b87ed014ff4d5e99334c169
然后再验证下是否启动成功,docker ps,显示如下,成功启动起来了
~ docker ps ✔ took 39s base Py at 11:15:34
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67f5096b644f kibana:7.17.6 "/bin/tini -- /usr/l…" 21 seconds ago Up 20 seconds 0.0.0.0:5601->5601/tcp kibana
85cb69aec5e4 elasticsearch:7.17.6 "/bin/tini -- /usr/l…" 21 minutes ago Up 21 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
在浏览器端输入:localhost:5601,显示如下,则表示kibana安装成功了
现在的界面显示是纯英文的,下面我们要做一个配置的修改,让其显示成中文的
首先拷贝kibana的配置文件到挂载的目录下,然后对其进行修改
复制容器中的配置文件到挂载的目录下
docker cp kibana:/usr/share/kibana/config/kibana.yml /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/kibana/
给文件赋权限
chmod 777 kibana/kibana.yml
然后编辑这个配置文件,添加这行配置到该文件中
i18n.locale: zh-CN
然后将原来的容器删除,重新启动容器
#删除原来未挂载的容器
docker rm -f kibana
# 启动容器并挂载
docker run -d --name kibana \
-p 5601:5601 \
-v /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
--net somenetwork \
kibana:7.17.6
注意:如果使用挂载配置文件的方式启动的话,elasticsearch.hosts 这需填写 http://ip:9200,而不能使用容器名了,否则后面 kibana 连接 es 会失败。这个IP地址最好是你本机的内网IP地址
然后通过浏览器访问,就支持中文了
五、docker desktop安装logstash
启动命令
docker run -d --name logstash --net somenetwork -p 4560:4560 logstash:7.17.6
执行完显示如下;
Unable to find image 'logstash:7.17.6' locally
7.17.6: Pulling from library/logstash
Digest: sha256:90a4cca2b81abef53a5ae17275d71dd928ed13de14c8ae00e3f0686baeb28e05
Status: Downloaded newer image for logstash:7.17.6
b986b6152aea825e02dd4ead1143c6d091a4dd47da87a1e1fb5a64b28c375edb
验证logstash是否启动成功,查看logstash的进程,命令:docker ps
~ docker ps ✔ took 21s base Py at 11:31:40
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b986b6152aea logstash:7.17.6 "/usr/local/bin/dock…" About a minute ago Up About a minute 5044/tcp, 0.0.0.0:4560->4560/tcp, 9600/tcp logstash
67f5096b644f kibana:7.17.6 "/bin/tini -- /usr/l…" 17 minutes ago Up 17 minutes 0.0.0.0:5601->5601/tcp kibana
85cb69aec5e4 elasticsearch:7.17.6 "/bin/tini -- /usr/l…" 39 minutes ago Up 39 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
下面以挂载的方式启动
首先还是在本地新建logstash的相应目录
/Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash
复制docker容器内的文件到挂载的路径下
docker cp logstash:/usr/share/logstash/config /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/
docker cp logstash:/usr/share/logstash/data /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/
docker cp logstash:/usr/share/logstash/pipeline /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/
给文件夹赋权限
chmod -R 777 /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/*
修改 logstash/config 下的 logstash.yml 文件,主要修改 es 的地址:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.16.27.1:9200" ]
修改 logstash/pipeline 下的 logstash.conf 文件:
input {
tcp {
mode => "server"
host => "0.0.0.0" # 允许任意主机发送日志
port => 5044
codec => json_lines # 数据格式
}
}
output {
elasticsearch {
hosts => ["http://172.16.27.1:9200"] # ElasticSearch 的地址和端口
index => "elk" # 指定索引名
codec => "json"
}
stdout {
codec => rubydebug
}
}
修改完成后,删除之前的镜像文件,并且重新启动
#注意先删除之前的容器
docker rm -f logstash
# 启动容器并挂载
docker run -d --name logstash --net somenetwork \
--privileged=true \
-p 5044:5044 -p 9600:9600 \
-v /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/data/:/usr/share/logstash/data \
-v /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/config/:/usr/share/logstash/config \
-v /Users/wuzhanxi/mac_soft/system_soft/code_environment/es_out_disk/logstash/pipeline/:/usr/share/logstash/pipeline \
logstash:7.17.6
然后可以查看启动日志,看看程序是否有问题
查看命令
docker logs logstash
今天测试的时候,我总是先访问浏览器,其实最省事儿,最直接的还是查看各个组件的启动日志,日志中没有特别明显错误,然后再去浏览器上,这样其实更省时省力(好习惯需要慢慢养成吧)
安装过程中遇到的问题及记录
stacktrace": ["org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: setting [cluster.initial_master_nodes] is not allowed when [discovery.type] is set to [single-node]",
"at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:173) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) ~[elasticsearch-cli-7.17.6.jar:7.17.6]",
"at org.elasticsearch.cli.Command.main(Command.java:77) ~[elasticsearch-cli-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-7.17.6.jar:7.17.6]",
"Caused by: java.lang.IllegalArgumentException: setting [cluster.initial_master_nodes] is not allowed when [discovery.type] is set to [single-node]",
"at org.elasticsearch.cluster.coordination.ClusterBootstrapService.<init>(ClusterBootstrapService.java:89) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.cluster.coordination.Coordinator.<init>(Coordinator.java:253) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.discovery.DiscoveryModule.<init>(DiscoveryModule.java:189) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.node.Node.<init>(Node.java:885) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.node.Node.<init>(Node.java:309) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) ~[elasticsearch-7.17.6.jar:7.17.6]",
"at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169) ~[elasticsearch-7.17.6.jar:7.17.6]",
"... 6 more"] }
uncaught exception in thread [main]
java.lang.IllegalArgumentException: setting [cluster.initial_master_nodes] is not allowed when [discovery.type] is set to [single-node]
at org.elasticsearch.cluster.coordination.ClusterBootstrapService.<init>(ClusterBootstrapService.java:89)
at org.elasticsearch.cluster.coordination.Coordinator.<init>(Coordinator.java:253)
at org.elasticsearch.discovery.DiscoveryModule.<init>(DiscoveryModule.java:189)
at org.elasticsearch.node.Node.<init>(Node.java:885)
at org.elasticsearch.node.Node.<init>(Node.java:309)
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234)
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160)
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
at org.elasticsearch.cli.Command.main(Command.java:77)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)
For complete error details, refer to the log at /usr/share/elasticsearch/logs/wzx-es.log
Kibana报错:
Unable to retrieve version information from Elasticsearch nodes
这个报错的原因是kibana配置外部挂载的方式启动,所以这个IP地址这里需要是本机的内网IP地址才行,Elasticsearch中的配置文件不需要进行修改