Docker核心概念间转换关系:
什么是dockerfile?
dockerfile可以理解为构建docker images的源码(原料)
docker可以通过读取一个dockerfile来自动构建docker image
dockerfile 是一个文本文件,其中包含了按顺序排列的构建指定镜像所需的全部命令。
dockerfiles 采用特殊格式,使用一系列特别的指令。
dockerfile可以放在任意路径,但文件名称必须为Dockerfile,且D必须是大写
dockerfile格式要求:
# Comment 注释信息
INSTRUCTION arguments 指令+参数
可以设置 .dockeringore 指定不打包进镜像的文件列表
在docker build中执行的shell命令环境是由基础镜像所包含的命令集合
${ varriable:-default } 如果变量未设置值,则给变量赋一个默认值
${ variable: +default } 如果已经给变量设置过值,则用default代替变量的值
注意:
指令不区分大小写,然而,一般默认写成大写
Dockerfile中的指令会按照顺序执行
第一个非注释行,必须是’FROM’指令,指出基于哪个基础镜像
常用docker指令及说明:
下面将对这些常用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>事先不存在,它将会被自动创建,这包括其父目录路径
示例:
创建一个测试页面,必须和Dockerfile在同一目录中
echo This is a test Server > index.html
创建名称为tinyhttpd:v1的镜像
docker build -t tinyhttpd:v1 ./
可以看到自定义内容已写入到生成的镜像中
docker run –name tinyweb1 –rm tinyhttpd:v1 cat /data/web/html
示例:打包本地yum仓库到镜像
首先把本地库文件移到至Dockerfile同一目录下
编写Dockerfile文件加入一行:
COPY yum.repos.d /etc/yum.repos.d/
docker build -t tinyhttpd:v2 ./
可看到本地仓库已放入到生成的镜像中
docker run –name tinyweb1 –rm tinyhttpd:v2 ls /etc/yum.repos.d/
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>指定目录下
而当<src>为本地tar文件时,文件将被加压到<dest>目录下
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
docker build -t tinyhttpd:v5 ./
结果与v4版本相同
docker run –name tinyweb1 –rm tinyhttpd:v5 ls /usr/local/src/nginx-1.15.2
VOLUME
功能:用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其
它容器上的卷
格式:
VOLUME <mountpoint> 或
VOLUME [“<mountpoint>”]
如果挂载点目录路径下此前在文件存在,docker run命令会在卷挂载完成后将此
前的所有文件复制到新挂载的卷中
示例:
docker run –name tinyweb1 –rm tinyhttpd:v6
docker run –name tinyweb1 –rm tinyhttpd:v6 mount
EXPOSE
功能:用于为容器打开指定要监听的端口以实现与外部通信,暴露端口
格式:EXPOSE <port>[/<protcol>] [<port>[/<protcol>] …
<protcol>用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
EXPOSE指令可一次指定多个端口,例如
EXPOSE 121/udp 121/tcp
示例:
配置暴露dockerfile tcp 80端口
docker build -t tinyhttpd:v7 ./
本机默认可访问,但80端口未暴露给其他主机
docker run –name tinyweb1 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html
加-P选项,可以暴露端口
切换另外一台主机进行访问:
我们也可以指定宿主机端口对应docker容器中暴露的端口
docker run –name tinyweb1 -p 80:80 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html
此时访问宿主机的80端口,成功访问
ENV
功能:用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令
(如ENV、ADD、COPY等)所调用
调用格式为$varible_name或${varible_name}
格式:
ENV <key> <value> 或
ENV <key>=<value>
1、第一种格式中,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只
能设置一个变量;
2、第二种格式可用一次设置多个变量,每个变量为一个”<key>=<value>”的键值对,如果
<value>中包含空格,可以反斜线(\)进行转义,也可通过对<value>加引号进行标识;另
外,反斜线也可用于续行;
3、定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能
示例:
docker build -t tinyhttpd:v8 ./
docker run –name tinyweb1 –rm -P tinyhttpd:v8 printenv
也可在启动镜像时定义变量改变docker镜像中的已定义变量
docker run –name tinyweb1 –rm -P -e WEB_SERVER_PACKAGE=”nginx-1.15.1″ tinyhttpd:v8 printenv
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
docker build -t tinyhttpd:v9 ./
docker run -name tinyweb1 -rm tinyhttpd:v9 lscd /usr/local/src
CMD
作用:类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不
过,二者的运行时间点不同
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
docker build -t myweb:v2 ./
docker run –name myweb1 –rm -it myweb:v2 cat /etc/nginx/conf.d/www.conf
前端运行
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
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/104623