Dockerfile概念简介——镜像分层
一、dockerfile概念
- dockerfile是自定义镜像 的一套规则
- dockerfile由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层
1.1docker镜像的分层
dockerfile的原理就是镜像分层。
- Dockerfile 中的每个指令都会创建一个新的镜像层 (是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
- 镜像层将被缓存和复用 (后续的镜像层将基于前面的一层,每一层都会有下几层的缓存)
- 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)
- 某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就再成功,相当于地基)
- 容器的修改并不会影响镜像 ,如果在某一层中添加一个文件,在下一层中删除它,镜像中依然会包含该文件
二、Docker镜像的创建
2.1基于dockerfile创建
dockerfile是由一组指令组 成的文件
dockerfile每行支持一条指令,每条指令可携带多个参数,一条指令可以用&&方式,去写多条指令。
dockerfile支持以“#”为开头的注释
2.1.1dockerfile 结构(四部分)
- 基础镜像信息(Linux发行版:centos ubantu suse debian alpine redhat)
- 维护者信息(docker search可查看)
- 镜像操作指令(tar yum make)
- 容器启动时执行指令(cmd[“/root/run.sh”] 、entrypoint 都是系统启动时,第一个加载的程序/脚本/命令)
三、dockerfile操作指令
指令 | 含义 |
---|---|
FROM [镜像] | 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令,例如centos:7。from有两层含义:①开启一个新的镜像②必须写的一行指令 |
MAINTAINER [名字] | 说明新镜像的维护人信息(可写可不写) |
RUN命令 | 每一条RUN后面跟一条命令,在所基于的镜像上执行命令,并提交到新的镜像中,RUN必须大写 |
CMD [“要运行的程序”,“参数1”、“参数2”] | 指定启动容器时需要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条,“bin/bash”也是一条CMD,并且会覆盖image镜像里面的cmd。 |
EXPOSE [端口号] | 指定新镜像加载到Docker时要开启的端口**(暴露端口)** ,就是这个容器暴露出去的端口号。 |
ENV [环境变量] [变量值] | 设置一个环境变量 的值,会被后面的RUN使用。容器可以根据自己的需求创建时传入环境变量,镜像不可以。 |