Docker学习总结(三)——使用DockerFile构建镜像

Docker学习总结(三)——使用Dockerfile构建镜像

一、Dockerfile基础命令

  • FROM centos:FROM命令是用来设置基础镜像,这行命令的用于设置该镜像的基础镜像,若不需要设置基础镜像则用FROM scratch表示;
  • MAINTAINER yy:MAINTAINER命令用于设置维护该镜像的人或者组织;
  • LABEL version="1.0"
  • LABEL description = “xxx”:LABEL命令用于设置说明信息,该条指令与MAINTAINER一样,没有特别的用途,仅是记录描述信息;
  • WORKDIR /usr/local:WORKDIR命令用于切换至工作目录,该条语句的作用相当于 cd /usr/local,这条指令后可以用绝对路径也可以用相对路径,但是建议使用绝对路径更加直观,方便后面维护修改;
  • ADD/COPY xxx.txt .:ADD和COPY指令都可将指定文件或者目录复制到镜像中的制定目录下,但ADD指令还有解压缩以及添加远程文件的功能;
  • ENV JAVA_HOME /usr/local/openjdk8:ENV指令用于设置环境变量,若在后续指令中需要用到该目录,用${JAVA_HOME}指代即可,且若需要对环境进行修改,也仅需要对此处进行修改,更加便捷;

二、Dockerfile执行指令

Dockerfile执行指令共有三种,分别是RUN,CMD和ENTRYPOINT,按照他们执行时间进行区分的话可以分为两种类型,一种是在构建镜像的时候执行的RUN指令,另外一种是在启动容器的时候执行的ENTRYPOINT和CMD指令,且都有shell和Exec两种命令格式,以下将对这三种指令以及两种命令格式进行进一步说明:

  • RUN:在构建镜像时执行,对镜像内部资源的调整,且镜像为只读的,无法进行修改;
  • ENTRYPOINT:字面理解,入口点,在容器运行时执行,且一定会执行,若Dockerfile中有多行ENTRYPOINT命令,则只执行最后一行;
  • CMD:CMD命令和ENTRYPOINT命令一样,都是在容器运行时执行,且当都多行CMD命令时就只有一条CMD命令会执行,不同的是,CMD命令可以通过运行容器时传递参数,若在容器及逆行传递参数,那么Dockerfile中的CMD命令就会被覆盖,因此Dockerfile中的CMD命令是不一定会被执行的;

Shell命令格式和Exec命令格式的不同之处在于在执行Shell指令时会生成一个子进程,执行完之后会退回到父进程中,子进程不会对父进程产生影响,而Exec指令格式则会直接替换掉当前进程,并且保持PID不变,执行完之后不会退回到原来的进程环境中,这里推荐使用Exec指令格式,这种指令格式在各个官方文件中使用的也比较多。文件中以下说明Shell命令格式和Exec命令格式,以用RUN指令执行yum install -y vim 为例:

  • Shell:RUN yum install -y vim
  • Exec:RUN [“yum”,“instll”,"-y",“vim”]

以下以一组对比实验说明ENTRYPOINT和CMD指令的不同之处;

第一组实验:

在这里插入图片描述

这是Dockerfile文件,以centos为基础镜像,在构建时输出语句“docker build”,同时在运行镜像时执行ps -ef命令,结果如下图所示:

在这里插入图片描述

在这里插入图片描述

第二组实验:

在这里插入图片描述

这一个Dockerfile文件略有不同,在执行容器时执行ps -aux命令,结果如下所示:

在这里插入图片描述

在这里插入图片描述

以下就上面的对比实验进行几点说明:

  1. 在实验2的第二幅图中,也就是构建镜像的过程中,红色框中第二行显示的是“Using cache”,以及MAINTAINER指令下方也是,镜像的构成其实是一层一层镜像堆起来的,镜像的每一个step其实都会生成一个临时镜像,如果再之后的构建过程中再次用到同一条指令,那么docker就会从内存中直接读取,而不会重新构建;
  2. 实验2中的三幅图,我对同一个镜像运行了两个容器,第一个容器中没有传参,容器启动时执行指令ps -aux,在COMMAND下可以看到,第二个容器启动时在最后进行传参 -ef,最终可以从结果中看到COMMAND下方显示的指令是ps -ef,这也就是之前说到的CMD指令在运行容器有附加命令时则不会执行。

三、使用Dockerfile构建redis镜像文件

FROM centos
MAINTAINER xxx
LABEL description="redis build by xxx"
RUN ["yum","install","-y","gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-x.x.xx.tar.gz .
WORKDIR /usr/local/redis-x.x.xx/src
RUN make && make install
WORKDIR /usr/local/redis-x.x.xx
ADD redis.conf .
EXPOSE 6379
CMD ["redis-server","redis.conf"]
  • 在构建之前需要准备好redis相应版本的tar包,以及配置文件,RUN命令执行下载命令,下载redis安装必要的工具,ADD命令将tar包转移到指定文件夹中;
  • RUN指令执行编译以及安装的指令,然后再将配置文件转移到指定文件夹;
  • EXPOSE表示暴露出接口,6379是redis的默认端口号,最后CMD命令启动redis服务器,最后一步采用CMD的执行方式好处在于用户可以自由的选择启动redis服务器的方式,比如说当有多个配置文件时,用户可以对配置文件进行选择,这样更加灵活;
  • 通过非docker方式安装redis的人应该很熟悉这个流程,这其实就是将我们安装redis的步骤翻译成指令来执行;
  • redis官方提供了镜像,这里仅仅为了整体说明Dockerfile的使用。

edis的步骤翻译成指令来执行;

  • redis官方提供了镜像,这里仅仅为了整体说明Dockerfile的使用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值