最近在网上看到一个博客项目,正好用到了最近想学的知识,所以准备跟着做一下。自己做项目那环境必须自己搭对不对?刚开始就碰壁了,哈哈哈哈
背景及简介
博客项目需要实现一个搜索引擎,技术选型就选择了ES,Kibana则是针对ES的开源分析及可视化平台,用来搜索、查看交互存储在ES搜索引擎中的数据,kibana可以通过各种图表进行高级数据分析及展示,基于浏览器的界面可以快速创建仪表盘,实时显示查询动态。在docker容器中直接pull到的kibana无法更改kibana.yml文件,真的是无了个大语。latested版本使用的Debian系统,并且镜像文件中无法使用vim命令。因此,我就按照常规的解决方式,执行命令apt-get update,然后在执行apt-get install vim,这时候是会报错镜像源使用错误。于是在网上找了大量的解决方案如何设置Debian的镜像源以及如何正确安装vim,大多数的解决方案是让我们vim /etc/apt/sources.list,真是无语哈。我本来就是没有vim命令,结果还要让我使用vim命令去编辑配置文件安装vim命令。不知道写博客的童鞋是怎么想的哈!!!还是我这边理解的有什么错误,欢迎大家指正。现在感觉是自相矛盾的~~
综上所述,项目搭建遇到两个问题
第一,容器内文件不可直接编辑,如何正确启动容器
第二,kibana需要保证与es进行通信。
解决方案
Docker容器是有数据卷这个概念的。docker是将应用和环境一块打包成一个镜像!如果数据也在镜像中,那么容器如果删除了,数据也会跟着删除。
需求:数据可以持久化
容器之间就需要有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷的技术!目的是挂载,将容器内的目录挂载到Linux/其他宿主机上面。容器间也是数据共享的!因此,在容器启动的时候,可以使用容器卷挂载的方式。
另外,Kibana需要与ES通,因此需要保障两个容器是能够互相通信的,这里就需要使用Docker网络相关的技术。
Docker容器间
刚刚有说到Docker容器数据持久化的问题,本质的解决方案就是把数据保存在宿主机上,然后让宿主机与容器共享数据,docker中提供了两种解决方案。
数据卷挂载
直接使用命令挂载 -v (该参数可以连续使用,同时挂载多个目录)
docker run -it -v 主机目录:容器内目录 镜像名称 [其他命令]
比如将容器centos的home 目录挂载到 主机的home/ceshi 目录
1. 执行挂载命令
docker run -it -v /home/ceshi:/home centos /bin/bash
2.查看详细信息
docker inspect 20c7cad5d91c
会出现如下字样,就表示挂载成功了
"Mounts": [
{
"Type": "bind",
"Source": "/home/ceshi", //主机地址
"Destination": "/home", //容器内地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
通过使用数据卷的技术,当容器停止的时候,主机上修改内容,容器内的内容也会跟着改变。
挂载的方式分为三种,一种是匿名挂载,一种是具名挂载,还可以指定具体路径挂载。
- -v 容器内路径 #匿名挂载
- -v 卷名:容器内路径 #具名挂载
- -v /主机目录:/容器内目录 # 指定路径挂载
其中,指定路径挂载比较好理解,下面来看一下匿名与具名挂载的方式。
匿名挂载
1.在使用 -v 的时候只是使用 容器内路径,不写主机的目录
docker run -it -v :/home centos /bin/bash
2. 使用docker volume ls 查看卷的使用情况(这里会发现所有的路径都是加密的,无法使用)
DRIVER VOLUME NAME
local 5ba2ea0173a86d839d55f2c0d3bed0277f7f1178f79e0b8b0be9549b1c3850b3
local 0071643dc6d89383d5c76a2f36d9b2dfa76d86007f458c0aa69ac338d2f57dcb
local 662636764a35685a6cafaedf7931bb094bb7cd72092169d156fe1be10be86045
local dd0254fee82706f5ebf4e00eb3f3d0ac6d1c772170eb8fbc051741d104dd4545
具名挂载
1. 启动容器的时候设置需要挂载的目录为具名挂载
docker run -it -v juming-nginx:/home centos /bin/bash
2. 使用docker volume ls 查看挂载卷的使用情况docker volume ls (这里可以看到我们挂载的卷的位置信息)
local e655a3a7c74fc13ef83bdc5e29c7951aa3b3f2a0d932b13a40cf7ca575ef003e
local juming-nginx
3. 使用docker volume inspect juming-nginx 查看我们挂载信息的具体内容
[
{
"CreatedAt": "209:02:47+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
可以看到"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", 就是我们挂载的具体目录
进入该目录就可以看到我们具体的挂载信息。
DockerFile
Dockerfile 就是用来构建docker 镜像的构建文件!
相当于手工制作了一个镜像,实际上就是一段命令脚本,将命令脚本启动执行。
通过这个脚本可以生成一个镜像~~镜像是一层一层的,脚本就是一个一个的命令,每个命令都是一层。
编写一个脚本 vim dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
931968626
执行build 命令进行构建镜像 docker build -f dockerfile1 -t grogetestcent/centos .
注意这里要小写,镜像名称前面不能添加斜杠
查看一下镜像的详细信docker inspect accc2377655f
可以发现Mounts 中已经包好挂载目录
"Mounts": [
{
"Type": "volume",
"Name": "f4550a5f11fb7a94ec47fe931609f34547a782a059e3cd0fcbd3a8f8ca179854",
"Source": "/var/lib/docker/volumes/f4550a5f11fb7a94ec47fe931609f34547a782a059e3cd0fcbd3a8f8ca179854/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "44cc8d65408fb1f99087339a02c675df26918de6a72167133b158f5f54d8f341",
"Source": "/var/lib/docker/volumes/44cc8d65408fb1f99087339a02c675df26918de6a72167133b158f5f54d8f341/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Docker网络
上面介绍解决了第一个配置文件的问题,现在查看一下两个容器的地址是多少docker exec -it kibana2 ip addr
kibana2 : inet 172.17.0.3/16
es : inet 172.17.0.2/16
可以发现这两个容器的网络是在同一个网段上的,ping一下也是可以ping通的。所以配置es的地址时,这里可以配置成固定ip。
–link
如果ip地址变换了,在启动kibana的时候,又要重新配置一下配置文件。那么直接ping一下es的名称是不是可以ping通呢。
经过测试,是ping不通的。
docker exec -it kibana2 ping es
ping: es: Name or service not known
针对这个问题,可以通过使用–link命令进行启动。
正确启动
经过上述过程的探索,docker容器正确启动kibana的过程可以总结如下:
- 第一次启动kibana获取kibana.yml配置文件,可以使用whereis kibana.yml命令找到配置问题
- 本地创建一个挂载目录,并创建kibana.yml配置文件,配置来源第一步
- 修改配置文件中的
server.port,server.host,elasticsearch.url,elasticsearch.startupTimeout - 执行如下命令重新开启kibaba
docker run --name kibana2 -p 5601:5601 --link es -v /Users/gorge/Desktop/dockerKibana/kibana.yml:/etc/kibana/kibana.yml -d kibana - 访问http://localhost:5601/ 即可
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~