首页 > 网络 > 云计算 >

【Docker江湖】之hub上镜像的使用,Dockerfile语法解读和数据管理

2016-10-21

使用现有的docker镜像配置ELK+rsyslog日志分析系统。我们可以自己启动一个docker容器,然后把自己的应用封装在容器中,但是用老罗的一句话,人生苦短,能走2步的不走9步,所以选择了开源。

需求分析

使用现有的docker镜像配置ELK+rsyslog日志分析系统
我们可以自己启动一个docker容器,然后把自己的应用封装在容器中,但是用老罗的一句话,人生苦短,能走2步的不走9步,所以选择了开源


如何使用现有的image

1:根据自己的需求进行搜索

eg:我需要在docker中部署elk的开发环境,那么我就要去docker 的官方hub中搜索elk
这里写图片描述

2:查看Tag和Dockerfile,这里有我们所需要的ELK版本所对应的image

这里写图片描述

3:选择适合自己的版本

这里我是用的是es241_l240_k461,在启动docker服务的机器上下载镜像

sudo docker pull sebp/elk:es241_l240_k461

4:创建本地映射文件目录

为什么要这么做,是为了更加方便的查看数据和保护数据,因为一旦docker died了,且不可restart,那么里边运行的服务所产生的数据对我们来说是不可恢复的,这里便需要创建文件目录做映射
这里我的环境是

虚拟机:redhat
ip:192.168.1.195
用户名:redhat

在redhat的目录下创建以下文件夹:

/home/redhat/docker-log-file/elasticsearch    :同步elasticsearch目录
/home/redhat/docker-log-file/logstash         :同步logstash目录
/home/redhat/docker-log-file/kibana           :同步kibana目录
/home/redhat/docker-log-file/logstash-conf    :同步logstash的configure文件

5:sebp/elk中的相关目录说明

sebp/elk:es241_l240_k461:

Elasticsearch的安装目录:   /usr/share/elasticsearch/
Elasticsearch的配置文件目录:/etc/elasticsearch/
Kibana和logstash的目录为:  /opt/kibana/   /opt/logstash/
ELK的日志目录:             /var/log/elasticsearch/   /var/log/logstash/     /var/log/kibana/
默认加载配置的文件路径:      /etc/logstash/conf.d/

特别说明:

在sebp/elk容器中的内置配置文件目录是/etc/logstash/conf.d,该目录下有五个配置文件,在容器启动的时候,该目录下的配置文件会自动被加载启动,当我们在实际开发中,需要将我们的配置文件覆盖掉该目录下的文件

6:容器启动

在容器启动的时候,要指定目录挂载和端口映射
启动命令:

sudo docker run \
-v /home/redhat/docker-log-file/elasticsearch/:/var/log/elasticsearch\
-v /home/redhat/docker-log-file/logstash/:/var/log/logstash \
-v /home/redhat/docker-log-file/kibana/:/var/log/kibana\
-v /home/redhat/docker-log-file/logstash-conf/:/etc/logstash/conf.d/ \
-p 9200:9200 \
-p 9300:9300 \
-p 5044:5044 \
-p 5601:5601 \
-p 5000:5000 -it –name elk sebp/elk:es241_l240_k461

-v 为目录的映射 -p 端口的映射

7:redhat本地配置rsyslog发送数据

sudo vim /etc/rsyslog.conf

在最后加入

*.*     @@192.168.1.195:5000
*.*     @192.168.1.195:5000

(我在192.168.1.195这台机器上进行测试和部署的 @@表示 tcp传输 @表示udp传输)

8:启动测试

启动容器的时候,容器内的服务会有一定的时间延迟,请耐心等待,否则不能观看到效果,容器造成error的错觉
执行

ssh localhost

分别可以输入错误的密码和正确的密码进行测试,这个时候观看我们的web界面,便可以在kibana界面中看到相应的message了

Dockerfile解读

细心的朋友会发现,我们在介绍sebp/elk时,跳过了dockerfile,在这里我们结合sebp/elk的dockerfile来看一下

sebp/elk-Dockerfile: https://hub.docker.com/r/sebp/elk/

接下来我们看几个 命令:


FROM:指定基础的image
该指令必须在dockerfile的最前边(注释类的除外),指定了所依赖的基础镜像,from ,image可以是远程仓库的,也可以是本地的

from image_name 指定基础image为该image的最后修改的版本
from image_name:tag 指定一个tag版本
比如说现在我们在/home/u_name/创建一个空的文件夹: mkdir mybuilddocker
新建一个dockerfile文件:vim dockerfile
输入 以下内容(意思是基于ubuntu最新版创建镜像):

FROM ubuntu

MAINTAINER:用来指定镜像创建者信息
用于将image制作者的相应信息写入image,当我们对制作好的image执行 docker inspect时,输出中有相应的字段记录信息
继续编辑dockerfile,加入:
MAINTAINER thinkgamer csdn blog http://blog.csdn.net/gamer_gyt

ADD:挂载文件
格式为ADD path1 path2
该命令将复制path1指定的到容器中的path2。 其中path1可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)。
eg:
ADD /home/redhat/test /home/test

ENV:用于设置环境变量
构建指令,在image中设置一个环境变量,比如说我们需要在容器中运行java程序,那么我们需要的便是一个java环境,假设我们在本地进行解压之后进行同步到容器的/opt/java目录,我们把java加入环境变量
编辑dockerfile:
ENV JAVA_HOME /opt/java

RUN:安装软件使用
比如说我们需要在基础的ubuntu镜像中安装一些软件,例如:vim,wget,curl等,我们可以这样写:
编辑dockerfile:
RUN apt-get install -y vim wget curl

EXPOSE:指定容器需要映射到宿主机器的端口
设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候, 可以配套的多次使用-p选项。
例如我们要暴露出 80,81,82端口
编辑dockerfile:
EXPOSE 80 81

在容器启动时应该进行指定:

sudo docker run -p 80:80 -p 81:81 -it --name othername image_name

COPY:复制
格式为COPY path1 path2
复制本地主机的path1(为Dockerfile所在目录的相对路径)到容器中的path2。
当使用本地目录为源目录时,推荐使用COPY。
eg:
COPY /home/path1 /home/path2

CMD:设置容器启动时执行的命令
支持三种格式
CMD [“executable”,”param1”,”param2”]使用exec执行,推荐方式;
CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用;
CMD [“param1”,”param2”]提供给ENTRYPOINT的默认参数;
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令。
eg:
CMD [ "/usr/local/bin/start.sh" ]

其他的一些语法如:

USER WORKDIR ONBUILD

数据管理

用户在使用docker的过程中,往往需要能查看docker容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这里就涉及到了容器的数据管理操作,容器中的数据管理有两种方式

1:数据卷

数据卷是一种特殊的存在于一个或者多个docker内部的不同于Union File System的目录,数据卷提供多种有用的特性用来持久化和共享数据

数据卷在docker初始化时创建。如果容器的镜像包含外挂的数据,外挂的数据将在卷初始化时被拷贝到新的本地卷。 数据卷可以被共享和在多个docker间复用。 可以对数据卷直接修改。 更新镜像时数据卷并不受影响。 即使镜像被删除,数据卷也仍然会持久化到本地

数据卷被设计用来持久化存储数据,独立于容器的生命周期,当你删除容器时,docker并不会自动删除数据卷,不使用的数据卷,也不会替你“垃圾回收”

使用-v 在docker容器中创建一个数据卷,如果要创建多个数据卷可以使用多个-v
Eg:启动容器并在容器的根目录下创建数据卷 myApp和myTest

sudo docker run -v /myApp -v /myTest -it image_name

可以使用 inspect命令查看数据卷

sudo docker inspect image_name

将宿主机目录挂载为数据卷,同样使用 -v
eg:启动容器将宿主机的home目录下的myApp和myTest挂载为容器的数据卷

sudo docker run -v /home/myApp:/myApp -v /home/myTest:/myTest -it image_name

2:数据卷容器

如果你有一些持久化的数据,并且想在不同的container之间共享这些数据,或者想在一些没有持久化的container中使用,最好的方法就是使用数据卷容器,再把数据mount到你的container
eg:启动一个容器

sudo docker run -it -d -v /volumedata ubuntu:latest

启动另一个容器(970为启动的第一个容器id的前3位,这里不需要写完整整个id,只要能唯一标示即可)

sudo docker run -it -d –volumes-from 970 ubuntu/docker:elk_rails

在第二个启动的容器中就可以看到volumedata这个文件夹,并编辑一个test文件,写入

hello volume container

进入第一个容器执行cat test,即可看到我们刚才编辑的数据

相关文章
最新文章
热点推荐