牛掰!Docker 从入门到上手的终极指南,看这一篇文章就够了!
今日分享开始啦,请大家多多指教~
前言
一次使用阿里云(Aliyun)1 核 2G centos7.5 云主机搭建 Docker 下的 ELK 环境,并导入 MS SQL Server 的商品数据以供 Kibana 展示的配置过程。
关于 Docker 配置,本文使用开源项目 docker-elk(该项目维护了一个 Docker Compose 版的 Elastic Stack), 在其上做简单修改。
1. 环境准备
1.1 Docker & Docker Compose
下载安装 Docker 和 Docker Compose
注:对于 Win/MacOS 系统安装 Docker 后自带 Docker Compsoe,不需要再次安装。Docker 安装好后,建议先配置相关权限,linux-postinstall。
1.2 docker-elk 项目
克隆到指定目录,这里指定到 /app/docker-elk
该项目初始结构(elk version 7.13)如下:
├── docker-compose.yml├── docker-stack.yml├── elasticsearch│ ├── config│ │ └── elasticsearch.yml│ └── Dockerfile├── extensions│ ├── apm-server│ ├── app-search│ ├── curator│ ├── logspout├── kibana│ ├── config│ │ └── kibana.yml│ └── Dockerfile├── LICENSE├── logstash│ ├── config│ │ └── logstash.yml│ ├── Dockerfile│ └── pipeline│ └── logstash.conf└── README.md└── .env
1.3 docker compose
据介绍,docker compose 是一个方便配置多 container 的工具。之前一个容器一个容器的 run ,有好多配置要直接写在命令行上,如果需要再次运行就要再写一遍参数很不方便。
注:项目根目录下的 .env 文件中定义了一个变量,指定了 elk 的版本,默认是 latest。可自行修改,修改后需要 build 才会生效:docker-compose build。
要运行 docker compose 项目,请切换到项目根目录,然后运行 docker-compose up [service name]命令,如果不指定 service name,则启动所有服务。
2 Elastics Stack 的配置
首先进行下述配置:
修改/etc/sysctl.conf:vm.max_map_count = 262144,修改完运行 sysctl -p 使之生效或者退出当前终端重进使之生效。
elasticsearch.yml 配置文件中的 xpack.license.self_generated.type 修改为 basic 来禁用 X-Pack 相关收费功能。
由于机器内存太小,导致实际运行中容器各种退出,我选择将 Elastic Stack 三者的 xpack.monitoring.enabled 统统关闭。打开 .yml,修改相应配置项为:
xpack.monitoring.collection.enabled: false
xpack.monitoring.enabled: false
特别注意,对于阿里云服务器,还需要配置安全组规则以开放 docker 的端口,否则外网无法访问 docker 容器。本文添加端口规则如图:
接下来分别记录 Elastic Stack 的配置。需要说明的是,关于这三者的配置,前面提到过,编排文件可以极大地方便 docker 的容器配置,尤其是多容器场景,使 docker 更方便的 run。同时,每个容器在编排文件里的环境变量(?) enviroment 里也可以进行此容器本身的配置。也就是说,本文要配置的 Elastic Stack,既可以找到他们各自目录里的 .yml 在里面写配置项,也可以在编排文件里找到各容器的 environment 属性,在其下写配置项。
2.1 Elasticsearch
Docker compose 编排文件(docker-compose.yml)里的 Elasticsearch service 定义了 Elasticsearch 的 docker 配置,以及一些 Elasticsearch 本身的运行参数。本文主要进行了 Elasticsearch logging 写入文件并持久化保存到磁盘以及跨域开启这两点设置。
2.1.1 跨域
首先进行跨域开启设置。为了能用 elasticsearch-head 插件访问 elasticsearch,elasticsearch 需要开启跨域。
如前所述,直接在 docker-compose.yml 里配置和在 elasticsearch.yml 里配置这两种方式都可以。本文直接在编排文件里配。找到 elasticsearch service 的 environment 属性,在其下添加:
http.cors.enabled: "true"
http.cors.allow-origin: "*"
因为 docker-elk 项目初始的 Elastic Stack 都有认证机制,故还需要添加:
http.cors.allow-headers: "Content-Type,Content-Length,Authorization"
http.cors.allow-credentials: "true"
此时,启动 elasticsearch 容器:docker-compose up elasticsearch,浏览器用 elasticsearh-head 访问 http://yourhost:9200/ 可以看到仍无法连接,打开 F12,会发现 ERROR CODE 401,在地址后添加认证信息。
注意,本文这里的用户名和密码用的是默认的。
2.1.2 logging
Elasticsearch 的运行日志记录(logging)一般而言不需要,但本文在此次部署过程中发生了多起 elasticsearch 的报错事件,为方便填坑学习,本文配置日志记录并做持久化。
Elastic Stack 运行日志默认输出到 console,在屏幕上可以看到,但是写到文件里则需要配置日志保存的路径(容器内的路径):
path.logs: /usr/share/elasticsearch/logs
下一步是配置 log4j2.properties 这个文件。在 elasticsearch config 下新建一个文件,叫做 log4j2.properties。其内容本文选择从容器内拷贝过来。注意,容器内有两个长得比较像的文件,一个是 log4j2.properties,另一个是 log4j2.file.properties。其区别是后者多了日志写入到文件的配置。所以,后者的内容是我们需要拷贝的。
文件新建好后,需要绑定到容器内。打开 docker-compose.yml,在 elasticsearch 的 volumes 里添加:
当然,实现配置映射还有其他方式,本文采用上述这种方式,即通过绑定挂载文件的方式。关于绑定挂载下文会再次提及。
此时,启动容器,并进入容器内部,查看对应文件夹是否有 log 文件。如果没有 log 文件请逐一检查上述配置,有时可能只是笔误打错了字导致。
注:每次修改配置文件后需要重新启动。如果配置仍不生效,手动停止容器 docker stop [container id]然后手动启动 docker-compose up logstash。这里记录一下,docker-compose down 命令是停止并移除实例(docker-compose down -v 命令则会连同 volume 一起移除)。
2.2 Logstash
本文主要的工作量其实都在 Logstash,故 Logstash 的配置内容还是比较多的。
关于从 sql server 导入数据到 es;
一般来说,解决该问题的常见思路有以下几种:
利用数据库触发器,在需要监听的字段或表上创建触发器
使用数据库的一些特性,比如本篇想说的 SQL Server CDC,或者 MySQL 的 Bin Log 等
在程序中修改 DB 数据的地方,同时修改搜索引擎中的数据
利用 DB 中的 LastModifyTime 之类的字段来追踪变更
2.2.1 导入数据
首先,下载 jdbc jar 包,下载后解压到相应路径。
然后,准备好一份 .conf 文件,下面给出模板。
上面的 input jdbc plugin 中 SQL 语句配置了 statement_filepath。因此对应的 some.sql 文件也需要通过 bind-mount 绑定到容器中。
这里再给出一份正式版本的 .conf 文件:
这里定时查询与跟踪表 Table1 的变化,依据是上一次查询时间。第一次查询的初始时间是'1970-01-01 08:00',具体请查看上述 jdbc 文档。这里的 filter 用来完成重命名字段名称的工作。
此时,运行 Elasticsearch 和 Logstash,在 head 插件上打开可以看到相应的 index 及其 document。
2.2.2 logging
与 Elasticsearch 一样,本文出于排除 Bug 的需要,配置 logstash 的 logging。
log 写入的配置与前文 Elasticsearch 一样,需要指定 logs 文件夹的路径。
另外,可以顺便指定 log 的 level 和格式。log level 默认是 info 级别的。在 yml 中添加如下三行。
log.level: info
path.logs: /usr/share/logstash/logs
log.format: plain
logstash 同样需要配置 log4j2.properties 文件。如果不指定,则使用默认的文件。这里要注意,默认的文件是 docker 版的,比正常版本的简化了很多。这里贴出正常版本的 logstash (version 7.12)的 log4j2.properties。
新建的 log4j2.properties 文件同样需要 bind mount,步骤与 Elasticsearch 雷同。
以上两点配置好后,运行 logstash,发现 logs 下会有相应文件。
下面将 log 保存到硬盘以持久化数据。思路是利用数据卷 volume。这里还可以用 bind mount 绑定挂载实现数据持久化到硬盘。
1.打开 docker-compose.yml 到文件末尾找到 volumes,在其下添加 named volume,如下所示:
volumes:
elasticsearch:
logstash_logging:
elasticsearch_logging:
在此,一并将上文 Elasticsearch 的日志数据卷添加进去。
2.分别给 logstash 和 elasticsearch 配置 volumes 项,如下所示:
- type: volume
source: elasticsearch_logging
target: /usr/share/elasticsearch/logs
source 为刚才定义的 volumes 名字,target 为在 .yml 里配置 path.logs 的路径。
运行容器,然后运行 docker volume ls 和 docker volume inspect volume_name 命令查看 elasticsearch 和 logstash 的 volume 路径。
可以看到,在 elasticsearch logging 的目录下有相应的文件。而 logstash 下却没有。进入 logstash 容器,找到之前的 logs 文件夹,发现其为空文件夹。
这是因为,logstash 容器是以 logstash 用户运行的,而自动生成的 volume 数据卷的存储目录需要 root 权限。反观 elasticsearch,它默认是以 root 用户运行的。这一点在进入容器后也可以观察到。所以,本文的解决方案是,设置 logstash 以 root 用户启动,在编排文件 logstash 里添加属性 user: root,如下所示:
到此,logstash 的基本配置已经完成,下面进行附加配置:logstash multiple pipelines 的配置。之所以配置多管道,是想把 logging 的东西展示到 kibana 里,查看它执行的 SQL Statement 等信息。
在开始附加配置之前,先说一个问题。本文选择的阿里云实例配置比较低,容器运行过程中总是报 exited)
2.2.3 multiple pipelines
logstash 支持多 pipeline1.首先,创建新的 .conf 文件,本文选择在 logstash 的 pipeline 文件夹下创建。本文使用的文件如下:
本文在这里遇到一点问题,即新建文件的首行首字母会被“吞”掉,于是将首行作为注释行。
2.在 logstash 的 config 文件夹下新建一个文件叫做 pipelines.yml,具体配置如下:
此处记录一下:本文在配置的时候,将 .conf 与 .yml 文件后缀搞混了,以致于耽误了很多时间。
同样地,配置文件写好需要挂载到容器内,给编排文件里的 logstash 添加此项:
启动 logstash,在 head 上可以看到 logging 数据同步到了 es。
2.3 Kibana
Kibana 的 yml 文件配置大致如下:
i18n.locale 这一行是设置 Kibana 的界面语言为中文。...设置完毕,启动 Kibana,访问 host 的 5601 端口开始使用。
今日份分享已结束,请大家多多包涵和指点!
评论