什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用 Dockerfile 定制镜像

这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。

1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

FROM nginx RUN echo "这是本地nginx镜像" > /usr/share/nginx/html/index.html

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

1.RUN <命令行命令>

<命令行命令> 等同于,在终端操作的 shell 命令。

2.exec 格式:

RUN ["可执行文件", "参数1", "参数2"]

例如:

RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。(我们在尽量使用一个run命令,并且使用&&连接,避免镜像文件过大)

当dockerfile文件准备完成后,使用docker build命令构建镜像

docker build -t nginx:local /e/project/(此处为Dockerfile文件的目录,也称之为上下文路径)

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

----++------

dockerfile常见命令详解:

1.COPY[--chown=user:group] <源文件路径> <目标文件路径>

2.CMD <shell命令> 类似于run,区别在于run是docker build时运行的,CMD时docker run时运行,dockerfile存在多个CMD时只有最后一个CMD生效,并且CMD 指定的程序可以被RUN命令行参数种指定要运行的程序所覆盖。(一句话RUN的权限高于CMD的权限)

3.entryPoint,类似于cmd,但是其指定参数不会被run命令参数所覆盖,但是如果run 使用了--entrypoint选项,则同样会被覆盖掉。 cmd可以和entry point搭配使用,entry point后面跟着定参,CMD后跟着变参。

from nginx entrypoint ["nginx",'-c'] CMD["/etc/nginx/nginx.conf"]

docker run nginx:test 此时为不传参运行镜像,那么会执行nginx -c /etc/nginx/nginx.conf

docker run nginx:test -c /etc/nginx/new.conf 此时为传参运行,此时执run后面的参数new.conf文件

4.ENV设置环境变量,为了给后面的指令使用 ENV ...

下文如果想使用这个参数,可以使用$key的方式直接使用环境变量;

5.ARG构建参数,类似于ENV,区别在于作用域的不同,ARG设置的环境变量只对DOckerfile内有效,只有在docker build过程种有效,镜像中不存在此变量。

ARG <参数名> = <值> 可以docker build --build-arg <参数名>=<值> 来覆盖

6.volume定义匿名数据卷,如果忘记挂载数据卷,会自动挂在到匿名卷。 作用:避免重要数据因容器重启而丢失;避免容器不断变大

volume ["<路径1>","路径2"] docker run -v 可以修改挂载点

7.expose只是申明端口,可以帮助镜像使用者了解镜像的端口,以便进行端口映射,在使用docker run -P 时会自动随机映射expose的端口;

expose 端口1

8.workdir指定工作目录,使用workdir指定的工作目录会在镜像的每一层中存在,前提是所指定的目录已经创建完成。

workdir 工作目录路径

9.user用于指定后续命令的用户和用户组

user 用户名:用户组

10.healthcheck用于指定某个程序或者指令来监视dockers容器服务的运行状态。

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

11.onbuild用于延迟构建命令的执行,就是dockerfile中使用onbuild指定的命令,在本次构建镜像的过程中不会执行。当新的dockerfile使用了之前构建的镜像from test-build,这时新镜像的dockerfile构建时才会执行test-build的dockerfile里面onbuild指定的命令。(孙镜像被才会执行子镜像中Onbuild后面指定的命令)

onbuild 其他指令

12.lable指令用于给镜像添加一些元数据,以键值对的形式

lable key1=value1 key2=value2

比如:

lable com.ydl.image.author='sc'