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"]
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 命令行
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
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