H__D  

DockerFile介绍

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

  在docker hub 上搜索并查看centos的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文件

 1 # 基础镜像 centos镜像
 2 FROM centos
 3 
 4 # 镜像维护者的姓名和邮箱地址
 5 MAINTAINER H__D<H__D@163.com>
 6 
 7 # 环境变量
 8 ENV MYPATH /usr/local
 9 
10 # 工作目录
11 WORKDIR $MYPATH
12 
13 # 构建时运行安装vim命令
14 RUN yum -y install vim
15 
16 # 构建时运行安装net-tools
17 RUN yum -y install net-tools
18 
19 # 当前容器对外暴露一个端口
20 EXPOSE 80
21 
22 # 启动时运行命令
23 CMD echo $MYPATH
24 
25 CMD echo "build success .............."
26 
27 CMD /bin/bash 

    2、构建

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

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

      

      

    3、运行

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

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

      

    4、列出镜像的变更历史

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

      命令:docker history test/mycentos:1.2

      

  C案例-CMD/ENTRYPOINT镜像案例

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

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

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

1 # 基础镜像 centos镜像
2 FROM centos
3 
4 # 启动时运行命令 
5 CMD ["/bin/echo", "Hello"]
View Code

      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"

        

    2、ENTRYPOINT:可以追加参数

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

 1 # 基础镜像 centos镜像
 2 FROM centos
 3 
 4 # 启动时运行命令 
 5 ENTRYPOINT ["/bin/echo", "Hello"]  
 6 
 7 # docker run -it [image] 运行后输出 
 8 # hello world
 9 # docker run -it [image] "命令行" 运行后输出
10 # hello 命令行
View Code

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

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

      3)测试

        命令:docker run -it test/myentrypoint

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

        

  D案例-ONBUILD

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

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

1 # 基础镜像 centos镜像
2 FROM centos
3 
4 # 被子镜像触发
5 ONBUILD RUN echo "now, build action is ok .............."
6 
7 # 启动时运行命令
8 CMD ["/bin/bash"]

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

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

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

1 # 基础镜像 centos镜像
2 FROM test/mycentos:1.5
3 
4 # 启动时运行命令
5 CMD ["/bin/bash"] 

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

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

    

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

  E案例-自定义镜像Tomcat9

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

 1 # 基础镜像 centos镜像
 2 FROM test/mycentos:1.5
 3 
 4 # 被子镜像触发
 5 ONBUILD RUN echo "now, build action is ok .............."
 6 
 7 # 启动时运行命令
 8 CMD ["/bin/bash"]
 9 
10 
11 # 基础镜像 centos镜像
12 FROM centos
13 
14 # 启动时运行命令 
15 ENTRYPOINT ["/bin/echo", "Hello"]  
16 CMD ["world"]
17 
18 #  docker run -it [image] 运行后输出 
19 # hello world
20 # docker run -it [image] "命令行" 运行后输出
21 # hello 命令行
22 
23 
24 # 基础镜像 centos镜像
25 FROM centos
26 
27 # 镜像维护者的姓名和邮箱地址
28 MAINTAINER H__D<H__D@163.com>
29 
30 # 把宿主机当前上下文中的c.txt拷贝到容器/usr/local/路径下
31 COPY c.txt /usr/local/container.txt
32 
33 # 把java与tomcat添加到容器中
34 ADD jdk-8u181-linux-x64.tar.gz /usr/local/
35 ADD apache-tomcat-9.0.12.tar.gz /usr/local/
36 
37 # 配置java与tomcat环境变量
38 ENV JAVA_HOME /usr/local/jdk1.8.0_181
39 ENV JRE_HOME $JAVA_HOME/jre 
40 ENV CLASSPATH .:$JAVA_HOME/lib:$JRE_HOME/lib 
41 ENV PATH $JAVA_HOME/bin:$PATH
42 
43 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.12
44 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.12
45 ENV PATH $CATALINA_HOME/bin:$PATH
46 
47 # 环境变量
48 ENV MYPATH /usr/local
49 
50 # 工作目录
51 WORKDIR $MYPATH
52 
53 # 构建时运行安装vim命令
54 RUN yum -y install vim
55 
56 # 构建时运行安装net-tools
57 RUN yum -y install net-tools
58 
59 # 当前容器对外暴露一个端口
60 EXPOSE 8080
61 
62 # 启动时运行命令
63 # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.12/bin/startup.sh"]
64 # CMD ["/usr/local/apache-tomcat-9.0.12/bin/catalina.sh", "run"]
65 CMD /usr/local/apache-tomcat-9.0.12/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.12/logs/catalina.out
View Code

    2、通过dockerfile9构建test/mytomcat:2.0镜像

      命令:docker build -f dockerfile9 -t test/mytomcat:2.0 .

    3、测试,启动镜像:

      命令:docker run -it -p 8080:8080 test/mytomcat:2.0

  

posted on 2020-03-26 00:48  H__D  阅读(324)  评论(0编辑  收藏  举报