dockerfile的工作流程
docker会从dockerfile文件的FROM头部指定的镜像运行一个容器
然后做出一条指令,对容器做出修改
接着执行类似于docker commit的操作,创建一个新的镜像层
然后在基于此镜像创建一个新的容器
在此镜像中依次执行dockerfile中的指令,直至指令结束
特点:Dockerfile有个好处就是他又缓存,只要不改变镜像层,他就是秒级别生成镜像。


image.png

1、FROM 指定基础镜像

格式:FROM Dockerfile - 图2 或者 FROM Dockerfile - 图3:
比如:FROM centos:7

2、MAINTAINER 指定维护者信息

格式:MAINTAINER
比如:MAINTAINER hxq hxq@foxmail.com

3、RUN 执行命令

1)shell模式:
RUN <命令> 就像直接在命令行中输入的命令一样
RUN 默认使用/bin/sh -c执行命令
例:RUN yum install -y httpd
例:RUN echo ‘

Hello, Docker!

‘ > /usr/share/nginx/html/index.html
2)exec模式
RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式
说明:RUN命令是用来执行命令行,注意每用一个RUN(dockerfile指令)就是镜像添加多一层(最大限制127层)。
执行多个指令用&&来连接(apt-get加上-y,表示系统安装提示都默认选择yes,否则制作镜像失败;如果&&命令之间有换行,记得行后要带上 \ )

4、COPY 复制文件

格式:COPY src desc
复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。
拷贝文件或目录到镜像(不能自动解压缩)

5、ADD 高级复制

格式:ADD src dest
比如:ADD [“src”,”dest”]或者ADD https://xxx.com/html.tar.gz /var/www/html
拷贝文件或目录到镜像(可以自动解压缩或者下载)
该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。

6、CMD 容器启动命令

是可以被 docker run 指令覆盖的,而ENTRYPOINT的参数可以被—entrypoint覆盖;会比CMD或者docker run指定的命令要靠前执行。

7、ENTRYPOINT 入口点


ENTRYPOINT [“executable”,”param1”,”param2”]
ENTRYPOINT command param1,param2 会在shell中执行。
用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。

8、ENV 用设置环境变量

这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。
格式:EVN key value
比如:ENV word hello
RUN echo $word

9、ARG 构建参数

10、VOLUMN 定义匿名卷

格式: VOLUME [“/data”]
作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。

11、EXPOSE 暴露端口

格式: EXPOSE port [port2,port3,…]
比如: EXPOSE 80 这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
功能为暴露容器运行时的监听端口给外部,但是EXPOSE并不会使容器访问主机的端口,如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数

12、WORKDIR 指定工作目录

格式: WORKDIR /path
比如: WORKDIR /path/to/workdir
为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

13、USER 指定当前用户

格式为:USER username
比如:RUN groupadd -r docker && useradd -r -g docker docker
指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。

14、HEALTHCHECK 健康检查


15、ONBUILD 镜像触发器

格式:ONBUILD [INSTRUCTION]
该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。
例如下面的Dockerfile创建了镜像A:
ONBUILD ADD . /app
ONBUILD RUN python app.py

则基于镜像A创建新的镜像时,新的Dockerfile中使用from A 指定基镜像时,会自动执行ONBBUILD指令内容,等价于在新的要构建镜像的Dockerfile中增加了两条指令:
FROM A
ADD ./app
RUN python app.py


16、docker build


创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。
通过 -t 指定镜像的标签信息
例如:docker build -t regenzm/first_image . ## “.”指定的是Dockerfile所在的路径