Docker容器技术之Dockerfile

什么是dockerfile?
dockerfile可以理解为构建docker images的源码(原料),docker可以通过读取一个dockerfile来自动构建docker镜像

Docker核心概念间转换关系:

1

什么是dockerfile?

dockerfile可以理解为构建docker images的源码(原料)

docker可以通过读取一个dockerfile来自动构建docker image

dockerfile 是一个文本文件,其中包含了按顺序排列的构建指定镜像所需的全部命令。

dockerfiles 采用特殊格式,使用一系列特别的指令。

dockerfile可以放在任意路径,但文件名称必须为Dockerfile,且D必须是大写

2

 

 

dockerfile格式要求:

# Comment  注释信息

INSTRUCTION arguments   指令+参数

 

可以设置 .dockeringore 指定不打包进镜像的文件列表

在docker build中执行的shell命令环境是由基础镜像所包含的命令集合

${ varriable:-default }  如果变量未设置值,则给变量赋一个默认值

${ variable: +default } 如果已经给变量设置过值,则用default代替变量的值

注意:

指令不区分大小写,然而,一般默认写成大写

Dockerfile中的指令会按照顺序执行

第一个非注释行,必须是’FROM’指令,指出基于哪个基础镜像

 

常用docker指令及说明:

dockerfile指令

 

下面将对这些常用docker指令进行详细介绍

FROM

FROM指令是最重的一个且必须为Dockerfile文件开篇的第一个非注释行,用于

为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运

行环境

实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在

docker主机上查找指定的镜像文件,在其不存在时,则会从Docker Hub Registry

上拉取所需的镜像文件

如果找不到指定的镜像文件,docker build会返回一个错误信息

格式:

FROM <repositry>[:<tag>]

FROM <resoitry>@<digest>

<repostiry>:指定作为base image的名称;

<tag>:base image的标签,为可选项,省略时默认为lates;

 

 

MAINTANIER (depracted)

功能:用于让Dockerfile制作者提供本人的详细信息

Dockerfile并不限制MAINTAINER指令可在出现的位置,但推荐将其放置于

FROM指令之后

格式:

MAINTAINER  <author’s detail>

<author’s detail>可是任何文本信息,但约定俗成地使用作者名称及邮件地址

MAINTAINER “wxlinux <ilinux@wxlinux.com>”

 

注:较新版本MAINTNIER已经用LABEL替代

 

LABEL

功能:可以给镜像添加标签,来帮助项目组织镜像、记录许可信息、帮助自动化或

出于其他原因。对于每个标签,添加一行以 LABEL 开头并带有一个或多个键值对

的行。下面示例显示了多种支持的格式。解释性意见包含在内。

格式:

LABEL <key>=<value> <key>=<value> <key>=<value> …

注意:1、如果字符串中包含空格,则必须用双引号引起来或转义这个空格。如果字

符串中包含双引号,必须转义

2、一个镜像可以有多个标签

 

COPY

功能:用于从Docker主机复制文件至创建的新映像文件

格式:

COPY <src> …<dest>

COPY [“<src>”,… “<dest>”]

<src>:要复制的源文件或目录,支持使用通配符

<dest>:目标路径,即正在创建的image的文件系统路径;建议为<dest>使用绝对

路径,否则,COPY指定则以WORKDIR为其起始路径;

注意:1、在路径中有空白字符时,通常使用第二种格式文件复制准则

<src>必须是build上下文中的路径,不能是其父目录中的文件

2、如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会

被复制如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目

录,且必须以/结尾

3、如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径

 

示例:

3

创建一个测试页面,必须和Dockerfile在同一目录中

echo This is a test Server > index.html

4

创建名称为tinyhttpd:v1的镜像

docker build -t tinyhttpd:v1 ./

5

可以看到自定义内容已写入到生成的镜像中

docker run –name tinyweb1 –rm tinyhttpd:v1 cat /data/web/html

6

 

示例:打包本地yum仓库到镜像

首先把本地库文件移到至Dockerfile同一目录下

编写Dockerfile文件加入一行:

COPY yum.repos.d /etc/yum.repos.d/

7

docker build -t tinyhttpd:v2 ./

可看到本地仓库已放入到生成的镜像中

docker run –name tinyweb1 –rm tinyhttpd:v2 ls /etc/yum.repos.d/

8

 

 

ADD

功能:ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径

格式:

ADD<src> .<dest>

ADD[“<src>”,. “<dest>”]

操作准则:

1、同COPY指令

2、如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直

接被创建为<dest>;

如果<dest>以/结尾,则文件名URL指定的文件将被直接下载并保存为<dest>

/<filename>

3、如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,

其行为类似于

“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开;

4、如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/

结尾的目录路径;

如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内容将被直接写入到<dest>;

 

 

示例:

当<src>为URL时,文件直接保存到<dest>指定目录下

9

10

而当<src>为本地tar文件时,文件将被加压到<dest>目录下

11

12

 

 

WORKDIR

功能:用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指

定设定工作目录

格式:

WORKDIR <dirpath>

1、在Dockerfile文件中,WORKDIR指令可出现多次,其路径也可以为相对

路径,不过,其是相对此前一个WORKDIR指令指定的路径

2、另外,WORKDIR也可调用由ENV指定义的变量

3、如果工作目录不存在,则Docker Daemon会自动创建

例如

WORKDIR /var/log  WORKDIR $STAEPATH

 

示例:

vim Dockerfile

13

docker build -t tinyhttpd:v5 ./

结果与v4版本相同

docker run –name tinyweb1 –rm tinyhttpd:v5 ls /usr/local/src/nginx-1.15.2

14

 

VOLUME

功能:用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其

它容器上的卷

格式:

VOLUME <mountpoint>

VOLUME [“<mountpoint>”]

如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂载完成后将此

前的所有文件复制到新挂载的卷中

 

 

示例:

15

docker run –name tinyweb1 –rm tinyhttpd:v6

docker run –name tinyweb1 –rm tinyhttpd:v6 mount

16

 

EXPOSE

功能:用于为容器打开指定要监听的端口以实现与外部通信,暴露端口

格式:EXPOSE <port>[/<protcol>] [<port>[/<protcol>] …

<protcol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议

 

EXPOSE指令可一次指定多个端口,例如

EXPOSE 121/udp 121/tcp

 

示例:

配置暴露dockerfile tcp 80端口

17

docker build -t tinyhttpd:v7 ./

本机默认可访问,但80端口未暴露给其他主机

docker run –name tinyweb1 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html

加-P选项,可以暴露端口

18

切换另外一台主机进行访问:

19

我们也可以指定宿主机端口对应docker容器中暴露的端口

docker run –name tinyweb1 -p 80:80 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html

20

此时访问宿主机的80端口,成功访问

21

 

 

ENV

功能:用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令

(如ENV、ADD、COPY等)所调用

调用格式为$varible_name或${varible_name}

格式:

ENV <key> <value>

ENV <key>=<value>

 

1、第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只

能设置一个变量;

2、第二种格式可用一次设置多个变量,每个变量为一个”<key>=<value>”的键值对,如果

<value>中包含空格,可以反斜线(\)进行转义,也可通过对<value>加引号进行标识;另

外,反斜线也可用于续行;

3、定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能

 

示例:

22

docker build -t tinyhttpd:v8 ./

docker run –name tinyweb1 –rm -P tinyhttpd:v8 printenv

23

也可在启动镜像时定义变量改变docker镜像中的已定义变量

docker run –name tinyweb1 –rm -P -e WEB_SERVER_PACKAGE=”nginx-1.15.1″ tinyhttpd:v8 printenv

24

 

 

RUN

功能:用于指定docker build过程中运行的程序,其可以是任何命令

格式:

RUN <comand>

RUN [“<excutable>”, <parm1>”, <parm2>”]

1、第一种格式中,<comand>通常是一个shel命令,且以“/bin/sh -c”来运行

它,这意味着此进程在容器中的PID不为1,不能接收Unix信号,因此,当使

用docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号;

2、第二种语法格式中的参数是一个JSON格式的数组,其中<excutable>为要

运行的命令,后面的<parmN>为传递给命令的选项或参数;然而,此种格式

指定的命令不会以“/bin/sh -c”来发起,因此常见的shel操作如变量替换以及通

配符(?,*等)替换将不会进行;不过,如果要运行的命令依赖于此shel特性的话,

可以将其替换为类似下面的格式。

RUN [“/bin/bash”, -c”, <excutable>”, <parm1>”]

注意:json数组中,要使用双引号

 

示例:

vim Dockfile

25

docker build -t tinyhttpd:v9 ./

docker run -name tinyweb1 -rm tinyhttpd:v9 lscd /usr/local/src

26

 

CMD

作用:类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不

过,二者的运行时间点不同

27

RUN指令运行于映像文件构建过程中,而CMD指令运行于基于Dockerfile构

建出的新映像文件启动一个容器时

CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结

束后,容器也将终止;不过,CMD指定的命令其可以被docker un的命令行选

项所覆盖

在Dockerfile中可以存在多个CMD指令,但仅最后一个会生效

格式:

CMD <comand>

CMD [“<excutable>”, “<parm1>”, “<parm2>”]

CMD [“<parm1>”,<parm2>”]

 

前两种语法格式的意义同RUN

第三种则用于为ENTRYPOINT指令提供默认参数

 

ENTRYPOINT

功能:1、类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像

是一个单独的可执行程序

2、与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数

所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序

不过,docker run命令的-entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序

格式:

ENTRYPOINT <comand>

ENTRYPOINT [“<excutable>”, <parm1>”, <parm2>”]

 

默认是在 /bin/sh中执行 所以可以定制脚本执行 再通过cmd 传递过来的命令(以exec $*)

作为第一进程

可以利用脚本来生成配置模板 通过 -e 创建容器的时候修改变量值 来实现你想实现的

配置文件等。

docker run命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最

后做为其参数使用

Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效

 

示例:

vim Dockerfile

28

29

docker build -t myweb:v2 ./

docker run –name myweb1 –rm -it myweb:v2 cat /etc/nginx/conf.d/www.conf

30

前端运行

docker run –name myweb1 –rm -it myweb:v3

 

USER

功能:用于指定运行image时的或运行Dockerfile中任何RUN、CMD或ENTRYPOINT

指令指定的程序时的用户名或UID

注意:默认情况下,container的运行身份为rot用户

格式:

USER <UID>|<UserName>

 

需要注意的是,<UID>可以为任意数字,但实践中其必须为/etc/paswd中某用户的有效

UID,否则,docker un命令将运行失败

 

 

 

HEALTHCHECK

功能:健康性状态检查

The options that can appear before CMD are:

–interval=DURATION (default: 30s) 每隔30秒探测一次

–timeout=DURATION (default: 30s) 服务器的超时时长

–start-period=DURATION (default: 0s) 初始化多少秒后再探测

–retries=N (default: 3)  探测几次

The command’s exit status indicates the health status of the container. The possible

values are:

 0: success – the container is healthy and ready for use (表示成功)

 1: unhealthy – the container is not working correctly (表示失败)

 2: reserved – do not use this exit code

 

示例:

vim Dockerfile

31

32

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104623

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班