【Application】Docker DockerFile解析(五)

DockerFile介绍

DockerFile是用来构建Docker镜像文件,是由一系列命令和参数构成的脚步

在docker hub 上搜索并查看centos的DockerFile如下:

  【Application】Docker DockerFile解析(五)

  DockerFile基础知识

1、每条保留字指令都必须为大写字幕且后面要跟随至少一个参数  

2、指令按照从上到下,顺序执行

3、#表示注释

4、每条指令都会创建一个新的镜像层,并对镜像进行提交

  DockerFile构建过程

1、docker从基础镜像运行一个容器

2、执行一条指令并对容器作出修改

3、执行类似docker commit的操作提交一个新的镜像层

4、docker再基于刚提交的镜像运行一个新容器

5、执行dockerfile中的下一条指令直到所有指令都执行完成

案例:

  可以参考【Application】Docker 容器数据卷(四)中,添加容器数据卷的方式二:使用DockerFile添加,此过程对比DockerFIle的构建过程

DockerFile保留字

1、FROM

  基础镜像,当前新镜像是基于那个镜像的

2、MAINTAINER

  镜像维护者的姓名和邮箱地址

3、RUN

  容器构建时需要运行的命令

4、EXPOSE

  当前容器对外暴露一个端口

5、WORKDIR

  指定再创建容器后,终端默认登录进来的工作目录

6、ENV

  用来在构建镜像过程中设置环境变量

7、ADD

  将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

8、COPY

  类似ADD,拷贝文件的目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置

  用法一:COPY src dest

  用法二:COPY ["src", "dest"]

9、VOLUME

  容器数据卷,用于数据保存和持久化工作

10、CMD

  指定一个容器启动时要运行的命令

  Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

11、ENTRYPOINT

  指定一个容器启动时要运行的命令

  ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

12、ONBUILD

  当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

A案例-Base镜像(scratch)

  Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

1 FROM scratch

  B案例-自定义镜像mycentos

  1、编写DockerFile文件

# 基础镜像 centos镜像
FROM centos

# 镜像维护者的姓名和邮箱地址
MAINTAINER H__D<H__D@163.com>

# 环境变量
ENV MYPATH /usr/local

# 工作目录
WORKDIR $MYPATH

# 构建时运行安装vim命令
RUN yum -y install vim

# 构建时运行安装net-tools
RUN yum -y install net-tools

# 当前容器对外暴露一个端口
EXPOSE 80

# 启动时运行命令
CMD echo $MYPATH

CMD echo "build success .............."

CMD /bin/bash 

  2、构建

    命令格式:docker build -t 新镜像名字:TAG .

      命令:docker build -f dockerfile2 -t test/mycentos:1.2 .

      【Application】Docker DockerFile解析(五)

      【Application】Docker DockerFile解析(五)

  3、运行

    命令格式:docker run -it 新镜像名字:TAG

      命令:docker run -it test/mycentos:1.2

      【Application】Docker DockerFile解析(五)

  4、列出镜像的变更历史

    命令格式:docker history 镜像名:TAG

    命令:docker history test/mycentos:1.2

    【Application】Docker DockerFile解析(五)

  C案例-CMD/ENTRYPOINT镜像案例

  都是指定一个容器启动时要运行的命令

  1、CMD:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

    1)新建一个dockerfile4,内容如下:

# 基础镜像 centos镜像
FROM centos

# 启动时运行命令 
CMD ["/bin/echo", "Hello"]

    2)通过dockerfile4,构建test/mycmd镜像

      命令:docker build -f dockerfile4 -t test/mycmd .

    3)测试

      命令:docker run -it test/mycmd

      命令:docker run -it test/mycmd /bin/echo "ABC"

      【Application】Docker DockerFile解析(五)

  2、ENTRYPOINT:可以追加参数

    1)新建一个dockerfile3,内容如下:

# 基础镜像 centos镜像
FROM centos

# 启动时运行命令 
ENTRYPOINT ["/bin/echo", "Hello"]  

# docker run -it [image] 运行后输出 
# hello world
# docker run -it [image] "命令行" 运行后输出
# hello 命令行

    2)通过dockerfile3,构建test/myentrypoint镜像

      命令:docker build -f dockerfile3 -t test/myentrypoint .

    3)测试

      命令:docker run -it test/myentrypoint

      命令:docker run -it test/myentrypoint "ABC"

      【Application】Docker DockerFile解析(五)

  D案例-ONBUILD

  ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

  1、新建一个dockerfile5文件,内容如下:

# 基础镜像 centos镜像
FROM centos

# 被子镜像触发
ONBUILD RUN echo "now, build action is ok .............."

# 启动时运行命令
CMD ["/bin/bash"]

  2、通过dockerfile5构建test/mycentos:1.5镜像

    命令:docker build -f dockerfile5 -t test/mycentos:1.5 .

  3、新建一个dockerfile6文件,基础镜像是test/mycentos:1.5,内容如下:

# 基础镜像 centos镜像
FROM test/mycentos:1.5

# 启动时运行命令
CMD ["/bin/bash"] 

  4、通过dockerfile6构建test/mycentos:1.6镜像

    命令:docker build -f dockerfile6 -t test/mycentos:1.6 .

  【Application】Docker DockerFile解析(五)

  通过观察,可以看到ONBUILD命令的作用

  E案例-自定义镜像Tomcat9

  

 

    

相关推荐