文章目录
Docker file 解析
简介
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本,记录了镜像构建的所有步骤。Dockerfile中每一个指令都会创建一个镜像层,上层是依赖于下层的。Docker会缓存已有镜像的镜像层,构建新镜像时,如果镜像层已经存在,就直接使用,无须重新创建。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。也就是说,如果我们改变Dockerfile指令的执行顺序,或者修改或添加指令,都会使缓存失效。
构建的三步骤
· 编写Dockerfile文件
· Docker build命令构建镜像
· Docker run依镜像运行容器实例
Docker执行Dockerfile的大致流程
Docker按顺序运行指令。一个Dockerfile 必须 从指令开始FROM。
(1)docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4)docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
看法:
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件镜像的运行态,也即依照镜像运行的容器实例
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
DockerFile常用保留字指令
该指令不区分大小写。但是,惯例是让他们 为大写,以便更轻松地将它们与参数区分开来。
cpp
· FROM 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
· MAINTAINER 镜像维护者的姓名和邮箱地址
· RUN RUN是在 docker build时运行
· EXPOSE 当前容器对外暴露出的端口
· WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
· USER 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
· ENV 用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
也可以在其它指令中直接使用这些环境变量,
比如:WORKDIR $MY_PATH
· ADD 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
· COPY 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
· COPY src dest COPY ["src", "dest"] <src源路径>:源文件或者源目录 <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
· VOLUME 容器数据卷,用于数据保存和持久化工作
· CMD 指定容器启动后的要干的事情
注意
· Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
· 参考官网Tomcat的dockerfile演示讲解
参考tomcat8的dockerfile入门
· https://github.com/docker-library/tomcat
命令格式:
ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
创建第一个Dockerfile
使用dockerfile构建ubuntu镜像(带有vim命令)
cpp
root@ubuntu:~#pwd 1
/mydocker
root@ubuntu:~# ls
Dockerfile 2
root@ubuntu:~# docker build -t ubuntu:1.1 . 3
Sending build context to Docker daemon 32.26 kB 4
Step 1 : FROM ubuntu 5
---> 01f29b872827
Step 2/2 : RUN apt-get update && apt-get install -y vim 6
---> Running in 19c79c1861f7 7
......
Setting up vim (2:8.2.3995-1ubuntu2.11) ...
---> 964d76ff07b0 8
Removing intermediate container 19c79c1861f7 9
Successfully built 964d76ff07b0 10
root@ubuntu:~#
1 当前目录为 /root。
2 Dockerfile准备就绪。
3 运行docker build命令,-t将新镜像命名为ubuntu-with-vi-dockerfile,命令末尾的.指明build context为当前目录。Docker默认会从build context中查找Dockerfile文件,我们也可以通过-f参数指定Dockerfile的位置。
4 从这步开始就是镜像真正的构建过程。首先Docker将build context中的所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。
Dockerfile中的ADD、COPY等命令可以将build context中的文件添加到镜像。此例中,build context为当前目录 /root,该目录下的所有文件和子目录都会被发送给Docker daemon。
所以,使用build context就得小心了,不要将多余文件放到build context,特别不要把 /、/usr作为build context,否则构建过程会相当缓慢甚至失败。
5 Step 1:执行FROM,将Ubuntu作为base镜像。
Ubuntu镜像ID为01f29b872827。
6 Step 2:执行RUN,安装vim,具体步骤为 ⑦ ⑧ ⑨。
7 启动ID为19c79c1861f7的临时容器,在容器中通过apt-get安装vim。
8 安装成功后,将容器保存为镜像,其ID为964d76ff07b0。
这一步底层使用的是类似docker commit的命令。
9 删除临时容器19c79c1861f7。
10 镜像构建成功
通过docker images查看构建好的镜像信息,如图所示。
查看镜像的分层结构
docjer history centos:1.1
注:missing表示无法获取IMAGE ID 通常从Docker Hub下载的镜像会有这个问题
镜像的缓存特性
Docker会缓存已有镜像的镜像层,构建新镜像时,如果镜像层已经存在,就直接使用,无须重新创建。
· 优点
· 在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。
· 注意
· 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。