最近搭建基于Spring Cloud的微服务框架,日志系统当然最佳选择就是ELK。看着MAC 那紧巴巴的配置,又不想热情退去而留下一堆软件,果断选择Docker安装来节省那可怜的资源。当然这只是鹏哥的一点点小心思。

为什么使用docker 这里就不在赘述了,相信就算现在猪肉贵你没吃过,但是新闻里至少有猪的图片你应该看过吧。这篇文章的主旨是搭建一个ELK(主要是elasticsearch + kibana,logstash会在spring cloud 继承ELK的文章中介绍),Docker充其量是一个工具,但是磨刀不误砍柴工,我们还是先来看看安装ELK过程中用到的Docker命令吧。

Docker 常见命令

search 命令

下载镜像之前我们应该先搜索到镜像,搜索镜像的命令:

docker search [OPTIONS] TERM

OPTIONS说明:

  • --automated :只列出 automated build类型的镜像;
  • --no-trunc :显示完整的镜像描述;
  • -s :列出收藏数不小于指定值的镜像。



docker pull拉取的镜像在哪 docker pull镜像失败_docker 命令


  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

pull 命令

搜索之后找到对应的镜像,然后我们调用pull命令将镜像拉到本地:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

OPTIONS说明:

  • -a :拉取所有 tagged 镜像
  • --disable-content-trust :忽略镜像的校验,默认开启


docker pull拉取的镜像在哪 docker pull镜像失败_docker命令_02


run命令

镜像下来之后,我们的最终目的是要运行这个镜像,运行镜像需要用到run命令。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb": 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --volume , -v: 绑定一个卷


docker pull拉取的镜像在哪 docker pull镜像失败_docker rmi 删除<none>_03


logs命令

镜像启动之后,会在容器里运行,那我们如何查看运行的情况呢?logs命令会帮我们输出运行的日志。

docker logs [OPTIONS] CONTAINER

OPTIONS说明:

  • -f : 跟踪日志输出
  • --since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • --tail :仅列出最新N条容器日志

ps 命令

镜像启动之后,会在有一个容器,如果我们想查看当前容器的信息,需要执行ps命令。

docker ps [OPTIONS]

OPTIONS说明:

  • -a :显示所有的容器,包括未运行的。
  • -f :根据条件过滤显示的内容。
  • --format :指定返回值的模板文件。
  • -l :显示最近创建的容器。
  • -n :列出最近创建的n个容器。
  • --no-trunc :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。


docker pull拉取的镜像在哪 docker pull镜像失败_docker rmi 删除<none>_04


输出详情介绍:

  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令。
  • CREATED: 容器的创建时间。
  • STATUS: 容器状态。状态有7种:created(已创建)restarting(重启中)running(运行中)removing(迁移中)paused(暂停)exited(停止)dead(死亡)
  • PORTS: 容器的端口信息和使用的连接类型(tcpudp)。
  • NAMES: 自动分配的容器名称。

exec 命令

有时候我们需要进入到镜像的内部,exec 命令会帮助我们在容器内部执行命令。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d :分离模式: 在后台运行
  • -i :即使没有附加也保持STDIN 打开
  • -t :分配一个伪终端

start/stop/restart 命令

  • docker start :启动一个或多个已经被停止的容器
  • docker stop :停止一个运行中的容器
  • docker restart :重启容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]

rm 命令

如果我们认为这个容器已经没有存在的意义了,我们可以执行rm 命令删除这个容器。

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS说明:

  • -f :通过 SIGKILL 信号强制删除一个运行中的容器。
  • -l :移除容器间的网络连接,而非容器本身。
  • -v :删除与容器关联的卷。

images命令

如果我们长期不使用,就会忘记我们之前拉取过那些,images 命令会列出我们本地所有的镜像。docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
  • --digests :显示镜像的摘要信息;
  • -f :显示满足条件的镜像;
  • --format :指定返回值的模板文件;
  • --no-trunc :显示完整的镜像信息;
  • -q :只显示镜像ID。


docker pull拉取的镜像在哪 docker pull镜像失败_docker命令_05


rmi

本地镜像如果不在需要,放在本地就会占用宝贵的存储资源,鹏哥就非常在意这个,所以我会定期使用rmi命令清理本地不用的镜像。

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS说明:

  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像,默认移除;

介绍完我们会用到的docker命令之后,安装ELK就是水到渠成的事了,下边我们来安装ELK。

Docker 安装 elasticsearch

在elastic 6.0 版本之后 elastic 官方开始维护自己的Docker镜像包,所以如果我们要搭建elk的花,官方的包当然是首选,我们选用最新的7.5.1 版本来搭建。首先我们执行pull命令 将镜像拉到本地:

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.1

执行完pull命令之后,我们起一个容器,为了后边方便kibana 链接,这里最好指定一个名称:

docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:7.5.1

启动完之后在浏览器输入 http://localhost:9200 ,如果能看到如下的输出,说明我们已经安装启动成功。


docker pull拉取的镜像在哪 docker pull镜像失败_docker 命令_06


Docker 安装 Kibana

安装完elasticsearch ,就像安装了一个命令行的操作系统,如果我们想直观的查看日志情况,我们需要一个GUI,kibana就是elastic的GUI,这也是elastic的核心竞争力。

同样的,我们先执行pull 命令拉下来7.5.1 版本的kibana,版本的选择有一定的要求:我们不能选高于elasticsearch的版本,同时又必须和elasticsearch 保持同样的大版本。当然简单起见我们选择同样的版本号是不会有问题的。

docker pull docker.elastic.co/kibana/kibana:7.5.1

拉完镜像之后,起一个容器,这里说明一下ELASTICSEARCH_URL 这个参数,鹏哥试下来似乎是没有作用的,可能是鹏哥不知道怎么用,如果有网友知道,也请帮忙告知一下,不胜感激。

docker run -d -p 5601:5601 --link elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 --name kibana docker.elastic.co/kibana/kibana:7.5.1

我们在起kibana的时候需要知道elasticsearch容器的名称,ELASTICSEARCH_URL的规则可以是 http://[elasticsearch 容器名称]:9200,也可以是elasticsearch的无理IP地址,但是不能是localhost, 因为这样会解析到kibana容器内部,导致无法连接elasticsearch 服务器。

这里我们设置的elasticsearch 容器名称跟kibana 默认的 名称重合了,所以我们不用修改任何配置,这个时候打开浏览器 输入 http://localhost:5601 就能看到kibana的欢迎页面。但是如果我们没有设置 elasticsearch 的容器名称或者设置的其他的字符串,那么需要我们修改kibana.yml 来指定这个名称。

首先使用 exec 进入容器:

docker exec -it [你的容器id] /bin/bash

然后使用vim 打开 kibana.yml

vi /usr/share/kibana/config/kibana.yml

修改完之后输入 exit 推出当前的容器。然后使用restart 命令,重启容器,就能看到效果了。

kibana 默认是英文界面,如果需要支持中文,可以按照上边的方式修改 kibana.yml ,在最后一行追加:

i18n.locale: zh-CN

重启kibana ,刷新浏览器就能看到效果了。


docker pull拉取的镜像在哪 docker pull镜像失败_docker 命令_07


总结

按照这套教程,你可以无脑的安装ELK而不用修改任何东西,也就是这是最简单的demo,如果你需要更高级别的配置,可以持续关注鹏哥的文章,因为鹏哥也在开始学习elastic 的东西。这套教程就是鹏哥花了两天的时间从零摸索出来的。虽然意义不大,但是没办法,鹏哥就是这么爱折腾。