【Application】Docker DockerFile解析(五)
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文件
# 基础镜像 centos镜像 FROM centos # 镜像维护者的姓名和邮箱地址 MAINTAINER H__D<[email protected]> # 环境变量 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 .
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,内容如下:
# 基础镜像 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"
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"
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 .
通过观察,可以看到ONBUILD命令的作用
E案例-自定义镜像Tomcat9