Docker file解析

文章目录

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 指令,仅最后一个生效。

相关推荐
MonkeyKing_sunyuhua18 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘2 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
全能全知者3 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
阿尔帕兹5 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口6 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
想进大厂的小王9 小时前
Spring-cloud 微服务 服务注册_服务发现-Eureka
微服务·eureka·服务发现
景天科技苑9 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge10 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes