您现在的位置是:首页 > 文章详情

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

日期:2016-10-18点击:428

这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处: http://blog.csdn.net/gamer_gyt
博主微博: http://weibo.com/234654758
Github: https://github.com/thinkgamer


Docker江湖


写在前边的话

    其实我很感谢我现在的工作,作为现阶段的我,能够与这样一群人一起工作,算是很幸运了吧,他们都很厉害,从他们身上我能学到很多东西,就比如说最近在研究的Docker。
    Docker的方便之处,在于快捷的交付与启动,他告别了传统虚拟机的资源消耗和内存占用,同时在于强大的社区支持,不同的人把自己的需求融合到docker中,放到官方给定的Docker hub中,以便于更多的人使用。
    当我们使用Docker的时候应该追求的是当我们启动docker的时候我们的所封装的应用也随着启动,而不是说进入容器再启动相应的应用,那样我们所使用的docker就变质了。


需求分析

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


如何使用现有的image

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

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

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,即可看到我们刚才编辑的数据


OVER!

原文链接:https://yq.aliyun.com/articles/413037
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章